Namespaces as Sugar (was: complexity tax)
Brendan Eich
brendan at mozilla.org
Mon May 26 14:45:48 PDT 2008
On May 26, 2008, at 12:05 PM, Mark S. Miller wrote:
> On Mon, May 26, 2008 at 11:29 AM, Brendan Eich
> <brendan at mozilla.org> wrote:
>> On May 26, 2008, at 10:34 AM, Mark S. Miller wrote:
>>> On Mon, May 26, 2008 at 10:22 AM, Brendan Eich <brendan at mozilla.org>
>>> wrote:
>>>> Why not give them both better syntax and better semantics?
>>> A wonderful idea! I eagerly await such a proposal.
>> Was that mere snarkiness?
>
> It was a snarky answer to what I perceived to be a snarky question. Of
> course we want "better". The whole argument is about which direction
> is better. Your question assumes your conclusion.
Not quite. My point was not snarky, and it did not assume a
conclusion -- it questioned your premise: "Rather than invent new
semantic concepts ...". You propose new syntax that desugars to
existing semantics. I am asking: is there a non-trivial benefit in
extending semantics too? Why not extend semantics too?
The answer turns, I think, on usability of namespaces, in particular
on whether "unqualified import" is important.
It may be hard to argue about usability except by pointing to other
languages. Hence my references to XML namespaces, which pretty
clearly suffer from lack of unqualified import.
It may be that you and I differ again in preferring ES3.1 vs. ES4
premises, and one of the ES4 premises you reject is "unqualified
import is important for usability" (assuming premises justifying
adding namespaces in the first place).
In that case, it would still help if you had an argument based on ES4
premises that led to a simpler ES4. But it would be sillly to repeat
ES3 premises as disqualifying a part of ES4, since they're different
evolutions of ES3 with different design goals based on different
premises.
> If I misunderstood your question, and if it actually wasn't snarky,
> then I apologize and withdraw the snarkiness of my answer.
Thanks.
>> The ES4 proposal has unqualified import. It has backward
>> compatibility in
>> the sense that it does not change the interpretation of obj
>> ["ns::prop"] or
>> obj["ns/prop"].
>
> Depends what you mean by "change the interpretation". IIUC, ES4 would
> change the interpretation of the second of these to
> obj[public::"ns/prop"] (or it would if string literals were allowed to
> the right of a colon).
It would be something like obj.public::["ns/prop"], but the point is
that this ES4 spelling makes no change from ES3 terms (obj["ns/
prop"]), where every property specified by ES3 or created by an ES3
programmer is in the public (compatibility) namespace. It's
equivalent syntax, it parses to the same post-definition-phase AST node.
> Namespaces-as-Sugar doesn't expand the set of
> mentionable property names, but it allows some to be said in a
> syntactically more convenient fashion. This doesn't change the meaning
> of obj["ns/prop"]. It just allows the syntax obj.ns::prop to mean the
> same thing.
Oh, I see. Two issues apart from usability:
1. Is it compatible with all relevant Ecma standards? It is not with
ECMA-357, E4X. Breaking compatibility with another Ecma standard, one
implemented in at least three common implementations (SpiderMonkey,
Rhino, ActionScript 3 in Flash 9 and higher), may be a cost worth
paying. I'm not convinced, and Ecma/ISO folks may frown on such an
overt incompatibility.
2. Is it compatible or safe (integrity-wise) if you allow unqualified
import? Once you allow the identifier expression prop to denote
obj.ns::prop in some ns-importing context where obj is on the scope
chain, it seems to me you've allowed arbitrary ES3 code to inject
identifiers into ES4 namespaces. Consider the case where obj is the
global object.
In ES4, a namespace (a first class object) can be hidden, internal to
a compilation unit (file or script source). It is therefore not
possible in ES4/ES3 mixed embeddings for ES3 to inject names into any
old namespace, just by prefixing "ns/" to the property identifier.
This is an important integrity property.
>> If it has other problems (it surely does -- we're working on
>> specifying it fully, and implementing it in the RI -- both of
>> which help
>> find problems), then please point them out.
>
> Section 4.7 "Name Resolution" of the draft spec document goes on for
> nine pages. Do you consider this a problem?
I already replied in an earlier thread: "I agree with you that
namespaces add more complexity than classes alone".
But for the record, no: high (or merely moderate) draft-spec page
counts do not constitute a problem by themselves. In particular, a
finished language spec may need many pages to specify something
subtle, which has the beneficial effect of *reducing* programmer
burden, including cognitive load or "complexity." Someone has to pay
for a solution to a problem such as namespacing. There's no free
lunch. Currently ES puts almost all the burden on the programmer.
Also, the spec draft pages currently dedicated to name lookup seem to
me ripe for reduction in size. Maybe not to one page, but we'll see.
It's too early, besides being inconclusive, to bean-count spec pages
and score accordingly.
> As for your (b), I fail to see why it's good. Remember, we are talking
> about property names here, not module linkage!
Who said anything about modules? Oliver Steele's "import" usage
should not mislead. We're talking about how to use namespaces without
requiring every reference to a namespace-qualified name to be
explicitly prefixed by a qualifier. Namespaces cut across compilation
unit, class, and object boundaries in ES4 as proposed.
> What's the compelling
> need for a single object to simultaneously have properties defined in
> different namespaces? How would those properties come to be added to
> that object? I just don't get it. Am I missing something?
There are many use-cases. Consider the ES4 spec and Reference
Implementation, which segregate helper and informative methods from
normative ones in the public namespace in the built-in classes. The
Flex framework written in AS3 uses namespaces extensively. C++
programmers use a different but related kind of namespace all the time.
Waldemar's original proposal had namespaces as a cross-cutting
versioning tool:
http://www.mozilla.org/js/language/old-js2/js20/rationale/
versioning.html
is worth a read if you haven't looked at his entire original proposal
(he mailed a tarball out recently).
Perhaps more important than any of this, the existing practice among
JS (Ajax) libraries uses namespaces, but allows unqualified import in
various ways to populate more properties of the importing scope
object with shorthands. With this optional importing comes greater
risk of name collision. But it sure looks a lot like ES4's 'use
namespace MochiKit' or 'use namespace dojo'. It looks like
unqualified import.
/be
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.mozilla.org/pipermail/es-discuss/attachments/20080526/9f2b0677/attachment-0002.html
More information about the Es4-discuss
mailing list