A stab at the sealer in E
Ka-Ping Yee
ping@lfw.org
Tue, 2 Nov 1999 16:57:35 -0800 (PST)
On Tue, 2 Nov 1999, Mark S. Miller wrote:
>
> An object with a single method. It is equivalent to
Thanks for the reminder.
Okay. How about this:
define BrandMaker make(name) {
define _key := []
define EnvelopeMaker make(contents) {
define Envelope {
to printOn(out) {
out print(`<Envelope sealed by $name>`)
}
to getContents(key) : any {
if (key == _key) {
contents
}
else {
throw(UnsealingException(
"envelope not sealed by matching sealer"))
}
}
}
}
define sealer {
to seal(contents) : any {
EnvelopeMaker make(contents)
}
}
define unsealer {
to unseal(envelope) : any {
envelope getContents(_key)
}
}
[sealer, unsealer]
}
Notes:
1. This is personal, but it seems surprising that "==" means
object identity here, and i can imagine a novice asking
"Why can't i get the contents of just any envelope with
envelope getContents([])?" I'm very hooked on Python's
"is" and "is not" operators.
2. I wandered through the E language documentation to find the
proper syntax for throwing an exception, and at first
thought that the lack of a "throw expression" section on
the grammar page was an omission. Now i realize that
"throw" must be a function object provided by the big bang,
but you might want to make this more explicit on the
grammar page. In general it was tricky to find the info
i needed to throw the right kind of exception (no sealer
documentation yet, throw signature not mentioned on grammar
page, no UnsealingException signature until i went to the
Java docs).
3. In the above i am using the convention of a leading _ for
private variables, often seen in C++. Perhaps this could
be another useful sanity check: variables whose names
begin with _ are never intended to escape outside the
scope in which they were defined.
4. The above is not tested in E. I just wrote it in a text
editor (which happens to be vim with E highlighting :) ).
Does this work?
-- ?!ng