Re: Exemplar forms (was Your search - | - did not match any documents)

2011-10-14 Thread Jake Verbaten
I agree having two types of examplers is sensible.

For examples sake let fExemplar be an exemplar constructed with new
Function and les oExemplar be the other one.

Now, I'm worried about magically making

fExemplar | oExemplar

work, would oExemplar have fExemplar or fExemplar.prototype in it's
[[Prototype]]? How do I tell the prototype of operator to treat fExemplar as
a function and not an exemplar.

same issues apply to oExemplar | fExemplar.
If you do any magic to make inheritance work across exemplar types then I
would need a way to tell the prototype of operator that they are just
objects  functions, not exemplars.

however we can already make the two work together like such

fExemplar.prototype | oExemplar

and

var sub = oExemplar.constructor | fExemplar
sub.prototype = Object.create(oExemplar);
sub.prototype.constructor = fExemplar

The fact that the latter is verbose and a pain doesnt matter, because thats
old style exemplars inheriting from new style exemplars.

However having new style exemplars in inheriting from old style exemplars is
less painful.

Yes we have the issue of the exemplars not being equal but I dont want you
to add magic to prototype of to fix that.

However it is reasonable to suggest a new operator for exemplar inheritance
that does do magic

[snip]

  I want to compose objects:
   var result = cookUpTheBehavior(goodies, stuff) |
 initializeTheState(args);
 
  You want something else, then. Just because you want B does not mean A
 is useless or less useful or not JavaScripty.
 
  With a decent Object.extend() we'd have a clean way to build objects
 without having to look up Crockford's web pages every time we try a
 different variation.
 
  Object.extend is on the agenda. It's not the same as |. Two different
 tools for two or more different jobs.


 I want these two tools to work together!   I want a standard property
 cloner and a composition operation that creates objects from a behavior
 object and data object.  Wouldn't that be nice?


I agree with this - at least in the sense that I think it might be an
appropriate time to take a higher level perspective of all the aspects of
JavaScript object definition and reuse. That seems to be a lot of what is
being discussed now from class literals to the | operator to new Object
to traits. I understand the value of decomposing these ideas down into
orthogonal part which can be used independently and combined to create a
variety of useful abstractions. However, I think that creating something
cohesive is really important, and in the end we will want to provide a clear
path for the common cases.

I find it a problem that there is a standard pattern in JavaScript for
creating classes but there isn't a real name for it. We have constructor
functions and prototypes. Even the Rhino book is forced to say, For lack of
a better term, I will use the word class informally in this chapter. Then
if you want to extend one of these things, you'll have to basically resort
to a library or some recipe of your own. It's black magic. And worse, all
the built-ins use the pattern, so we're basically going to have it around
forever.

I understand that this is sort of what | is for, and it is potentially what
class literals are for, I guess my point is just that I think it should be a
high priority for es.next to result in some definitive way of saying:

   1. create a thing Foo, including its constructor and at the very least
   methods (including get/set methods)
   2. create a Bar that extends Foo, including its constructor...

This is what Coffeescript provides with class and extend. I get the feeling
that using class would be too loaded. If class is going to be used it sounds
like people would like more than to have sugar for the existing pattern,
they would like more and they don't want to harm future proposals. I think
this is fair so I would say take the word class off the table. This is the
reason I had previously proposed | as more of a generic extension operator.
It's already doing a lot of magic when it comes to functions and arrays.

I'm not sure exactly what the answer is, I'll try to think of something
better to propose, I just feel like hashing out the individual pieces like
| and .{ and Object.extend etc. are all discussions that are worse off for
not discussing how they should all work together.

- Russ


Let me take a crack at tying to tie together all the pieces we have been
talking about.

To start, I want to introduce a new term that I will use to describe an
program construct that defines the common characteristics that are shared by
a probably open ended set of similar objects.  I want to avoid common terms
like class and prototype for such entities because they carry
preconception baggage that I want to avoid for now. Instead, I'm going to
use the term exemplar.  While there has been some limited usage of the
term exemplar  in computer science, it doesn't have any broadly accepted
meaning or carry significant connotations. 

Re: Exemplar forms (was Your search - | - did not match any documents)

2011-10-14 Thread Jake Verbaten
To expand on inheritance operator, I would treat es:h classes as declarative
sugar for exemplars. Therefore it would make sense to have the extends
keyword work on exemplars.

We could use oExemplar extends fExemplar and have that make inheritance work
as expected

On Oct 14, 2011 8:38 AM, Jake Verbaten rayn...@gmail.com wrote:

I agree having two types of examplers is sensible.

For examples sake let fExemplar be an exemplar constructed with new
Function and les oExemplar be the other one.

Now, I'm worried about magically making

fExemplar | oExemplar

work, would oExemplar have fExemplar or fExemplar.prototype in it's
[[Prototype]]? How do I tell the prototype of operator to treat fExemplar as
a function and not an exemplar.

same issues apply to oExemplar | fExemplar.
If you do any magic to make inheritance work across exemplar types then I
would need a way to tell the prototype of operator that they are just
objects  functions, not exemplars.

however we can already make the two work together like such

fExemplar.prototype | oExemplar

and

var sub = oExemplar.constructor | fExemplar
sub.prototype = Object.create(oExemplar);
sub.prototype.constructor = fExemplar

The fact that the latter is verbose and a pain doesnt matter, because thats
old style exemplars inheriting from new style exemplars.

However having new style exemplars in inheriting from old style exemplars is
less painful.

Yes we have the issue of the exemplars not being equal but I dont want you
to add magic to prototype of to fix that.

However it is reasonable to suggest a new operator for exemplar inheritance
that does do magic

  [snip] I want to compose objects:var result =
cookUpTheBehavior(goodies, s...
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Exemplar forms (was Your search - | - did not match any documents)

2011-10-14 Thread John J Barton
On Thu, Oct 13, 2011 at 4:14 PM, Allen Wirfs-Brock al...@wirfs-brock.comwrote:

 Let me take a crack at tying to tie together all the pieces we have been
 talking about.


Allen, I really appreciate your synthesis, thanks. I am able to follow some
of it because of my recent Q/A with the group. I think many more people
would be able to follow it if the approximate semantics of new features
where readily accessible. Maybe just an parenthetical explanation and a link
to the strawman page (these are pretty daunting however).

lots of interesting text elided



 This is a more complicated tory then simply having a traditional class
 model such as Dart is using.  However, we have an existing language with
 existing featuures with a wide range of usages patterns so whatever we do
 with classes we still have to accommodate what currently exists in JS. We
 are never going to have as simple a story as a do-over language such as
 Dart. But I do think we can craft a understandable story where all the
 pieces fit together relatively nicely.


I really like this perspective, with two caveats:

1) To achieve the goal of Keep the language pleasant for casual
developers., the correspondence between JS and traditional class models
needs to be real, clear, and communicated well. Points of disconnect need to
be ironed out.  The danger of saying class and meaning something different
are great but the dangers of saying Grawlix include no one caring about the
meaning.

2) Your proposal is dominated by declarative syntax for objects, in contrast
to practice which uses functions to construct objects. Of course it is
possible that your new features would obsolete that practice, but I doubt
it. By design the declarative syntax creates limits on objects that are
simple to overcome with direct manipulation.

jjb


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Exemplar forms (was Your search - | - did not match any documents)

2011-10-14 Thread Jake Verbaten
On Fri, Oct 14, 2011 at 5:54 PM, John J Barton
johnjbar...@johnjbarton.comwrote:



 On Thu, Oct 13, 2011 at 4:14 PM, Allen Wirfs-Brock 
 al...@wirfs-brock.comwrote:

 Let me take a crack at tying to tie together all the pieces we have been
 talking about.


 Allen, I really appreciate your synthesis, thanks. I am able to follow some
 of it because of my recent Q/A with the group. I think many more people
 would be able to follow it if the approximate semantics of new features
 where readily accessible. Maybe just an parenthetical explanation and a link
 to the strawman page (these are pretty daunting however).


I believe the following links may aid in explaining some of the content

 - ES:Harmony Object Literals
syntaxhttp://wiki.ecmascript.org/doku.php?id=harmony:object_literals
 - Axel's prototypes as classes
articlehttp://www.2ality.com/2011/06/prototypes-as-classes.html


 lots of interesting text elided



 This is a more complicated tory then simply having a traditional class
 model such as Dart is using.  However, we have an existing language with
 existing featuures with a wide range of usages patterns so whatever we do
 with classes we still have to accommodate what currently exists in JS. We
 are never going to have as simple a story as a do-over language such as
 Dart. But I do think we can craft a understandable story where all the
 pieces fit together relatively nicely.


 I really like this perspective, with two caveats:

 1) To achieve the goal of Keep the language pleasant for casual
 developers., the correspondence between JS and traditional class models
 needs to be real, clear, and communicated well. Points of disconnect need to
 be ironed out.  The danger of saying class and meaning something different
 are great but the dangers of saying Grawlix include no one caring about the
 meaning.

 2) Your proposal is dominated by declarative syntax for objects, in
 contrast to practice which uses functions to construct objects. Of course it
 is possible that your new features would obsolete that practice, but I doubt
 it. By design the declarative syntax creates limits on objects that are
 simple to overcome with direct manipulation.


I believe the use of declarative syntax is to get semantics across in a
terse well specified manner. All of his declarative syntax has existing
alternatives available we can use currently using methods. I don't think any
of the declarative syntax has limits.



 jjb


 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Exemplar forms (was Your search - | - did not match any documents)

2011-10-14 Thread Allen Wirfs-Brock

On Oct 14, 2011, at 12:38 AM, Jake Verbaten wrote:

 I agree having two types of examplers is sensible.
 
 For examples sake let fExemplar be an exemplar constructed with new 
 Function and les oExemplar be the other one.
 
 Now, I'm worried about magically making
 
 fExemplar | oExemplar
 
 work, would oExemplar have fExemplar or fExemplar.prototype in it's 
 [[Prototype]]? How do I tell the prototype of operator to treat fExemplar as 
 a function and not an exemplar.
 
 same issues apply to oExemplar | fExemplar.
 If you do any magic to make inheritance work across exemplar types then I 
 would need a way to tell the prototype of operator that they are just objects 
  functions, not exemplars.
 
 

We've already started down this path in the | proposal where it treats:
   var subclass = Function | {prototype: sup | {/*methods*/} } | function() 
{/*...*/};
differently from:
   var protoExtendedFunction = Function.prototype | {/*methods*/} | 
function() {/*...*/}

The subclass expression overrides the [[Prototype]] of both the subclass and 
subclass.prototype object.
The other expression just overrides the [[Prototype]] of the function object 
and protoextendedFunction.prototype still have Object.prototype as its 
[[Prototype]]

 however we can already make the two work together like such
 
 fExemplar.prototype | oExemplar
 
 and
 
 var sub = oExemplar.constructor | fExemplar
 sub.prototype = Object.create(oExemplar);
 sub.prototype.constructor = fExemplar
 
 The fact that the latter is verbose and a pain doesnt matter, because thats 
 old style exemplars inheriting from new style exemplars.
 
 
var oSubf = fExemplar.prototype | { /*an oExemplar };
var fSubo = oExemplar.constructor | function () {/*  a fExempar */};

is all that is needed to do the cross-over without any additional changes to |.

The reason I mentioned the possibility of extending the current definition to 
make the explicit property qualification unnecessary is that in past 
discussions about mixing prototypal and class inheritance patterns there were 
concerns raised about the verbosity of having to say .prototype and 
.constructor.

There is also a issue of wanting to be able to to do exemplar refinement 
without having to know if your are dealing a fExemplar or a oExemplar.  
Consider, a function such as:

function addMyDebugMethods(exmplr) {
return exmplr | {/* a bunch of methods */};
}

You might like to be able to call it with both a fExemplar and oExemplar.

I don't know if I really like pushing that far.  It might be better to keep it 
simpler.  But I think it is plausible that we could make this work.

Allen

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Exemplar forms (was Your search - | - did not match any documents)

2011-10-14 Thread Jake Verbaten
One thing that worries me about the fsubo example is that
oExemplar.constructor.prototype does not exist. How is that circular
relation ship between .constructor and .prototype magically fixed?

the other issue of fixing | for oExemplar | fExemplar (and vica versa) is
does it break oObject | fExemplar, where oObject looks like an exemplar but
isnt used as one.

If you can make it just work without leaking then that would be great

On Oct 14, 2011 7:09 PM, Allen Wirfs-Brock al...@wirfs-brock.com wrote:


On Oct 14, 2011, at 12:38 AM, Jake Verbaten wrote:  I agree having two
types of examplers is sensi...
We've already started down this path in the | proposal where it treats:
   var subclass = Function | {prototype: sup | {/*methods*/} } |
function() {/*...*/};
differently from:
   var protoExtendedFunction = Function.prototype | {/*methods*/} |
function() {/*...*/}

The subclass expression overrides the [[Prototype]] of both the subclass and
subclass.prototype object.
The other expression just overrides the [[Prototype]] of the function object
and protoextendedFunction.prototype still have Object.prototype as its
[[Prototype]]

 however we can already make the two work together like such  
fExemplar.prototype | oExemplar...
var oSubf = fExemplar.prototype | { /*an oExemplar };
var fSubo = oExemplar.constructor | function () {/*  a fExempar */};

is all that is needed to do the cross-over without any additional changes to
|.

The reason I mentioned the possibility of extending the current definition
to make the explicit property qualification unnecessary is that in past
discussions about mixing prototypal and class inheritance patterns there
were concerns raised about the verbosity of having to say .prototype and
.constructor.

There is also a issue of wanting to be able to to do exemplar refinement
without having to know if your are dealing a fExemplar or a oExemplar.
 Consider, a function such as:

function addMyDebugMethods(exmplr) {
return exmplr | {/* a bunch of methods */};
}

You might like to be able to call it with both a fExemplar and oExemplar.

I don't know if I really like pushing that far.  It might be better to keep
it simpler.  But I think it is plausible that we could make this work.

Allen
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Exemplar forms (was Your search - | - did not match any documents)

2011-10-14 Thread Allen Wirfs-Brock

On Oct 14, 2011, at 11:24 AM, Jake Verbaten wrote:

 One thing that worries me about the fsubo example is that 
 oExemplar.constructor.prototype does not exist. How is that circular relation 
 ship between .constructor and .prototype magically fixed?
 
 

This is something I alluded to in my original message in the context of 
instanceof.  For a oExemplar like this:

var Exmplr = {
   constructor () {/*...*/}
}

we would want to automatically generate a prototype property  such that
   Exmplr.constructor.prototype === Exmplr
is true.
 the other issue of fixing | for oExemplar | fExemplar (and vica versa) is 
 does it break oObject | fExemplar, where oObject looks like an exemplar but 
 isnt used as one.
 
 

I would define looks like a oExemplar as has a constructor own property.  
If it looks like a oExemplar and is used on the LHS of | then it is a 
oExemplar.

Allen

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Exemplar forms (was Your search - | - did not match any documents)

2011-10-13 Thread Allen Wirfs-Brock

On Oct 13, 2011, at 1:05 PM, Russell Leggett wrote:

 [snip] 
  I want to compose objects:
   var result = cookUpTheBehavior(goodies, stuff) | 
  initializeTheState(args);
 
  You want something else, then. Just because you want B does not mean A is 
  useless or less useful or not JavaScripty.
 
  With a decent Object.extend() we'd have a clean way to build objects 
  without having to look up Crockford's web pages every time we try a 
  different variation.
 
  Object.extend is on the agenda. It's not the same as |. Two different 
  tools for two or more different jobs.
 
 I want these two tools to work together!   I want a standard property cloner 
 and a composition operation that creates objects from a behavior object and 
 data object.  Wouldn't that be nice?
 
 I agree with this - at least in the sense that I think it might be an 
 appropriate time to take a higher level perspective of all the aspects of 
 JavaScript object definition and reuse. That seems to be a lot of what is 
 being discussed now from class literals to the | operator to new Object to 
 traits. I understand the value of decomposing these ideas down into 
 orthogonal part which can be used independently and combined to create a 
 variety of useful abstractions. However, I think that creating something 
 cohesive is really important, and in the end we will want to provide a clear 
 path for the common cases.
 
 I find it a problem that there is a standard pattern in JavaScript for 
 creating classes but there isn't a real name for it. We have constructor 
 functions and prototypes. Even the Rhino book is forced to say, For lack of 
 a better term, I will use the word class informally in this chapter. Then 
 if you want to extend one of these things, you'll have to basically resort to 
 a library or some recipe of your own. It's black magic. And worse, all the 
 built-ins use the pattern, so we're basically going to have it around forever.
 
 I understand that this is sort of what | is for, and it is potentially what 
 class literals are for, I guess my point is just that I think it should be a 
 high priority for es.next to result in some definitive way of saying:
 create a thing Foo, including its constructor and at the very least methods 
 (including get/set methods)
 create a Bar that extends Foo, including its constructor...
 This is what Coffeescript provides with class and extend. I get the feeling 
 that using class would be too loaded. If class is going to be used it sounds 
 like people would like more than to have sugar for the existing pattern, they 
 would like more and they don't want to harm future proposals. I think this is 
 fair so I would say take the word class off the table. This is the reason I 
 had previously proposed | as more of a generic extension operator. It's 
 already doing a lot of magic when it comes to functions and arrays.
 
 I'm not sure exactly what the answer is, I'll try to think of something 
 better to propose, I just feel like hashing out the individual pieces like | 
 and .{ and Object.extend etc. are all discussions that are worse off for not 
 discussing how they should all work together.
 
 - Russ

Let me take a crack at tying to tie together all the pieces we have been 
talking about.

To start, I want to introduce a new term that I will use to describe an program 
construct that defines the common characteristics that are shared by a probably 
open ended set of similar objects.  I want to avoid common terms like class 
and prototype for such entities because they carry preconception baggage that 
I want to avoid for now. Instead, I'm going to use the term exemplar.  While 
there has been some limited usage of the term exemplar  in computer science, 
it doesn't have any broadly accepted meaning or carry significant connotations. 
You have to get to the fourth page of a google search for exemplar before you 
find anything that is even vaguely related to CS.

In JS today, we essentially have two forms of exemplars.  One looks like this:
 
  function Foo(a,b) {
  this.x = a;
  this.y = b;
  }
 Foo.prototype.method = function () {...};

and makes it easy to parameterize the per instance state of new objects but it 
is awkward to specify the shared behavior of instance objects described by the 
exemplar.  The other form of exemplar looks like this:
  
 var Bar = {
   x: 0,
   y: 0,
   method() {...}
 }

and makes it easy to specify the shared behavior of instances but it is awkward 
to parameterize the per instance state of new objects described by the exemplar.

Are these two forms of exemplars really that different?  There may be reasons 
to prefer one form of expression over the other in various situations, but can 
we find a way to generally use and think about them interchangeably? 

One current difference is in how you create new instances of the exemplars.  
With the function form you say:
   var newObj = new Foo(1,2);

You can't currently do that with the literal form.