On Aug 25, 2008, at 12:23 PM, Peter Michaux wrote:
To refer to the instance in the sugared language, and there are valid
use-cases for doing so, we should use |this|. There's no point in
introducing a new keyword.
If there is a need to refer to the instance then "this" does make
sense. What would be a great success if if there is just no need for
"this" at all. It certainly seems possible to avoid.
I don't think so. Standard patterns of delegation (visitor, double-
dispatched dyadic operators) must pass |this| whole and intact.
Now there is another problem: differentiating between which variables
are local to the constructor function (that is, transient and garbage
collected after the constructor function is returned (don't know the
technical name for these variables))
Temporaries.
and which are properties of the
resulting returned object.
True temporaries might need explicit block scope to avoid being
entrained in closures.
Requiring the programmer to use both "public" and "private" as I did
below might be a solution (though you thought it is verbose) so that
it is clear which variables are part of the constructed objects.
But the private vars would not be temporary. They would need to live
as long as the instance. It seems to me you're mixing lifetime with
visibility.
I suggest at least a couple DOM widgets are used (e.g. tabbed pane,
dragdrop list, sortable table) as test examples when discussing class
sugar seriously. The DOM is a big part of the JavaScript world, after
all.
Great idea.
A lot of Ajax widgets, e.g. Dojo, use their own inheritance models,
often based on copying properties (sometimes based on prototypes; in
the case of Dojo's MI, both!). Copying is fine for a zero-inheritance
classes-as-sugar proposal. The prototype stuff, as Kris points out,
is different.
In ES3 a nested function is "private" inside the outer function. So
there is some sense of "private by default" already.
Lexical scope is great. You have a point.
No one seemed to response to my post in the thread about modules but
"module" should not equal "file" as HTTP is still expensive and
programmers want to concatenate and minify their scripts.
Oh, absolutely. I made the point in several posts, and Ibad picked up
on it: addressing and loading are outside the core language. The
inside part that's left is about how the importer names (or does not
name) the module, how the module provides what the importer requires,
how eagerly "linking" occurs, whether cycles are allowed (better
be!), etc.
The upshot is that stuff has to be loaded already. You can't block a
script mid-evaluation and go service events (violating run-to-
completion or else locking up some or all UI) to load a remote file
on demand.
The only unfortunate thing about "function" is they are not really
functions.
Ok, I will bite: what are they?
Another separable point to debate: resolved, classes should freely
nest (in
other classes and functions) and generate new entities each time
they are
evaluated. Just like functions (ignoring or removing the joined
function
object option from ES3).
Great!
I phrased this as a proposition to debate pro or con. I didn't mean
to say it was resolved (but I hope it will be, in Harmony).
There are deeper waters to do with types,
Yes. The parent-child windows issue both declaring the same or
different "class Foo" seems like an important detail. Perhaps provably
making nominal types useless or at least as awkward as instanceof?
No, nominal types have their uses. In two disjoint globals, loading
code defining the same nominal type should result in two types, not
one -- we don't want to trust the name, or compare the contents. The
name would simply be qualified by some kind of global identifier or
pathname.
Nominal type use-cases for security, which I've mentioned before,
include auditors (http://www.erights.org/elang/kernel/auditors/) and
hybrid information flow systems (http://www.ics.uci.edu/~franz/Site/
pubs-pdf/C46Prepub.pdf, see figure 3). When you need type relations
and equivalence based on name bound by special form, it's hard to do
without. As Mark pointed out in Oslo, nominal types plus lexical
scope let human and machine auditors know *exactly* what
implementation(s) a class has.
One can make nominal types via branding in a structural type system.
There's more to say here, later.
/be
_______________________________________________
Es-discuss mailing list
Es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss