On Jun 30, 2009, at 10:35 AM, Allen Wirfs-Brock wrote:
Pulling back from Mark's and Brendan's programming language
metaphysics discussion (which I think is interesting and useful) I
just wanted to say that I find Christian's proposal quite
interesting. It feels like a natural fit to the language as it
exists today and doesn't require any new abstraction concepts such
as classes, nominal type, value types, etc. although it could be
made compatible with any of them. It has a simple conceptual
explanation: an operator works with two object if they both
associate the same function with that operator.
It may or may not be the ultimate solution, but I think it deserves
serious consideration.
We can entertain strawman UI but I hope to focus on substance not
surface.
Costs that seem to leap out from Christian's mutual-asymmetric
multimethod proposal:
1. Two lookups, "this+" and "+this", required.
2. Intersection.
(2) looks like a transformation or simplification of standard
multimethod Class Precedence List usage to find the most specific
method. Any system allowing multiple methods for a given operator will
have something like it.
(1) seems avoidable, though -- *assuming* it is not a phantom cost. We
have to deal with the symmetric vs. encapsulated issue, though. But
notice that Christian's proposal does not use "this" in the method
bodies!
function pointPlusNumber(a, b) {
return new Point(a.x + b, a.y + b);
}
function numberPlusPoint(a, b) {
return new Point(a + b.x, a + b.y);
}
function addPoints(a, b) {
return new Point(a.x + b.x, a.y + b.y);
}
These are nice generic functions. With type annotations or guards, you
could imagine them as adding to generic function "+":
generic function "+"(a :Point, b :Point) {
return new Point(a.x + b.x, a.y + b.y);
}
Syntax is not the point, please hold fire and spare the bikeshed --
the unencapsulated (no |this| or |self|) nature of these functions is
what I'm stressing.
So why require "this+" and "+this" lookups?
If the reason is to assign responsibility to the different
constructors [*], then how can you tell who is responsible?
Function.defineOperator in the proposal binds both "this+" and
"+this". I agree these should not be plain old properties. But then
why spec them as named internal properties of any kind?
Suppose we had a generic function "+" (syntax TBD) to which methods
could be added for particular non-conflicting pairs of operand types.
Then the lookup would be for two types A and B, but this can be
optimized under the hood. See, e.g.,
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.35.4799
Seems worth allowing this kind of optimization. Whether and how users
add multimethods we can debate at greater length. But can we agree
that the "this+" and "+this" properties are not necessary?
/be
[*] or constructor.prototypes in your reply, but I don't see why we
would require noisy ".prototype" suffixing -- instanceof does not!
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss