Re: __doc__ for functions, classes, objects etc.

2011-09-05 Thread Andreas Rossberg
On 4 September 2011 21:45, Brendan Eich bren...@mozilla.com wrote:

 On Sep 6, 2011, at 1:52 PM, Dmitry Soshnikov wrote:

  (1) to standardize `toString` (for this particular case -- do not remove
 comments inside);
 
  If the (1) is not possible (why by the way?),

 Because comments are not saved in the compilation process and doing so
 would slow parsing down and take more space. It's not obvious this would
 matter in head-to-head competition with other browsers (esp. with minified
 benchmarks) -- we would have to find out.

 Switching to source recovery will entrain more space but may be tolerable
 -- except that switching to source recovery is work, competing with other
 demands. There's no free lunch.


Plus, it breaks all function-based data abstraction if you can reliably
reflect on its implementation and then even reify it through eval.

I am indifferent about the general idea of a doc interface, but: having to
peek at the _implementation_ of something (which is what toString does) in
order to gather its _interface_ description sounds like a fundamental
violation of basic principles and exactly the wrong way to go about it.

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


Re: __doc__ for functions, classes, objects etc.

2011-09-05 Thread Dmitry Soshnikov

On 05.09.2011 13:26, Andreas Rossberg wrote:
On 4 September 2011 21:45, Brendan Eich bren...@mozilla.com 
mailto:bren...@mozilla.com wrote:


On Sep 6, 2011, at 1:52 PM, Dmitry Soshnikov wrote:

 (1) to standardize `toString` (for this particular case -- do
not remove comments inside);

 If the (1) is not possible (why by the way?),

Because comments are not saved in the compilation process and
doing so would slow parsing down and take more space. It's not
obvious this would matter in head-to-head competition with other
browsers (esp. with minified benchmarks) -- we would have to find out.

Switching to source recovery will entrain more space but may be
tolerable -- except that switching to source recovery is work,
competing with other demands. There's no free lunch.


Plus, it breaks all function-based data abstraction if you can 
reliably reflect on its implementation and then even reify it through 
eval.




In other words, if to rephrase you, you nevertheless are talking about 
standardization of `toString`, but to make it some like this, right? :


Function.prototype.toString = function () {
  throw Don't break out abstractions, malicious hacker!
};

;)


I am indifferent about the general idea of a doc interface,


Then I don't think incorrect judging about the concept of an 
abstraction is a good topic in this thread (you may open a new one). 
Abstraction is about _abstraction_, it's not about security. 
Especially in the interpreted dynamically typed language with embedded 
reflection. Abstractions are for programmers. Not for hackers.


Anyway. It's a completely different story.

but: having to peek at the _implementation_ of something (which is 
what toString does) in order to gather its _interface_ description 
sounds like a fundamental violation of basic principles and exactly 
the wrong way to go about it.




Fundamental principle of an abstraction, once again, is _the 
abstraction_. That is, to provide convenient black box with API hiding 
implementation details. Thus, nobody says it's about security and that 
we can't use things directly if needed. Of course it's a bad practice to 
rely on the internal state. But in case of to string it's not even about 
application level. It's just a meta-reflection. Yes, achieved via such 
way. If it had been implemented at lower level (about what I was talking 
about), then we could get it via reflection API, e.g. Function.getDoc(fn).


However, I already mentioned, I already think it makes sense only for 
technologies such as Node.js (i.e. with big standard library on which 
it's needed often to get quickly help), not ECMAScript at its core.


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


Re: __doc__ for functions, classes, objects etc.

2011-09-04 Thread Brendan Eich
On Sep 6, 2011, at 1:52 PM, Dmitry Soshnikov wrote:

 (1) to standardize `toString` (for this particular case -- do not remove 
 comments inside);
 
 If the (1) is not possible (why by the way?),

Because comments are not saved in the compilation process and doing so would 
slow parsing down and take more space. It's not obvious this would matter in 
head-to-head competition with other browsers (esp. with minified benchmarks) -- 
we would have to find out.

Switching to source recovery will entrain more space but may be tolerable -- 
except that switching to source recovery is work, competing with other demands. 
There's no free lunch.

Anyway, that is the SpiderMonkey perspective. I'm not sure about Rhino or other 
engines that do not already retain the source buffer rather than implement a 
decompiler.

At a higher level, ECMA-262 has underspecified Function.prototype.toString 
forever. Jumping to the other extreme when there's a simpler and more direct 
solution seems like a mistake.


 then we can:
 
 (2) either to change grammar for function declarations/expression (to add 
 Documentation production before the `function` token; though, not so 
 convinient for FE, when e.g. foo: function () { ... })

I'm not sure what you mean in that parenthetical aside. We could say something 
much simpler, e.g. any labeled expression statement in prologue position must 
be retained (by whatever means) such that it appears in the toString result for 
the function containing that prologue.

Simpler specs that do not imply one and only one implementation technique are 
usually better.


 (3) make a pre-parsing of doc-comments and to inject them as a properties of 
 functions. I gave an example of such a pre-processor (just a small prototype, 
 but it can generate the docs and type-guards) -- 
 https://gist.github.com/1186853

How would this be part of the standard?

Remember browsers are not IDEs. They have to load code, including some 
comments, very quickly. They currently either parse and drop comments (which 
lexically are space) on the floor, or else retain whole source buffers or 
slices of source buffers for F.p.toString. TC39 is not going to add overhead to 
this process lightly.

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


Re: __doc__ for functions, classes, objects etc.

2011-09-03 Thread Dmitry Soshnikov

On 03.09.2011 3:07, Brendan Eich wrote:

On Sep 2, 2011, at 3:55 PM, Oliver Hunt wrote:


Function.toString isn't standardised, and I recall that in the past SM did 
elide dead code, multiple engines reformat code, so in general this doesnt seem 
reliable at a library level.  It also doesn't work for builtin functions, and I 
feel we'd want a solution that allows documentation for builtin functions as 
well.

Oh sure, Irakli is just making do with what happens to work. SpiderMonkey doesn't do 
source recovery, so it needs something special and the label hack Irakli found is 
it (for now!).

This thread was about standardizing something guaranteed that does not depend on 
toString, but we would love to have a winning library approach whose API we can 
standardize. Such a library could be scrappy (I hope not crappy ;-) about using 
what happens to work on particular engines and even versions.




If it had been the main goal, I wouldn't start the topic. Because I 
remember perfectly we already found before several hacks which just 
work right now in all (modern) engines. One of those:


function foo(x, y) {
  var __doc__ =  ... ;
}

though, of course places additional variable inside. However, from this 
viewpoint it doesn't matter about what developers will deal -- whether 
to write doc:  ... |  ... |  ... or var __doc__ =   
Completely doesn't matter. Since if they deal, they will just use an 
approach without worrying that e.g. name __doc__ can be used inside. It 
can't if the deal.


So all these hacks are fine for ad-hoc local experiments. Though, of 
course may lead to wide-spreading. In this case we should think which 
format of a documentation is better to chose (will you explain later why 
so strange syntactic form of a doc-string was chosen  -- that's 
because we couldn't find better hack when designing a library?).


Considered JavaDoc that's said would just work for tones of old code 
and automatically get support of the documentation and type-guards. 
OTOH, non-comment docs (such as vars or lables) allow not to worry about 
minifiers which won't remove them. But from this viewpoint it again 
doesn't matter how to leave this doc-string in the source code -- either 
with an option of a minifier or with a non-doc construct which will be 
skipped.


So, IMO we can't build a library on hacks which we then standardize. 
If to implement, then the best approach at the lower level, as Python 
did (with processing at compilation time).


If course we don't plan to include the feature for standardization (as 
Oliver noted; though, I'm not sure he worked with Python and couldn't 
appreciate its simplicity of getting the documentation on exactly 
*built-ins* and also frameworks), they yes -- it can be a simple ad-hoc 
library for local projects (because it will be hard to switch people 
from used JavaDocs to hack-versions of documentation; besides, an old 
code no one will want to rewrite for this).


Dmitry.


This shouldn't be taken as support for this idea (documentation as part of the 
language) as I feel that this is the type of feature i'd associate with the 
development environment rather than part of the language.

That's the other thing about a library approach: it doesn't need to land in 
language, but then the IDE may have to grow a full parser (probably good IDEs 
already have one).

/be

___
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: __doc__ for functions, classes, objects etc.

2011-09-03 Thread Allen Wirfs-Brock

On Sep 2, 2011, at 3:29 PM, Irakli Gozalishvili wrote:

 
 https://github.com/Gozala/doc 
 

I want to second Brendan on the coolness of this.  It really is a JavaScript 
derived solution rather than simply copying what somebody else did for some 
other language.

I have a couple of thoughts  to throw in.

The documentation description doesn't need to be a single structured string.  
It could also be something like:

   function sum(x, y) {
doc: {
  name: sum;
  parameters: {
x: first value to sum; expected: Number;
y: second value to sum; expected: Number;
  }
  returns: Number;
  description: Compute the sum of two numbers;
  docUrl: http://maysite.com/myapp/designDoc.html#sum;;
}
  
return x + y;
   }

This doc blocks looks something like an object literal but is really composed 
of  nested labelled blocks and statements.  However, it would be pretty easy to 
translate such a structure into a JSON object structure.

Whether a string or a structured labeled block is used, if we hope for multiple 
tools and IDEs to support it then somebody needs to propose and promote a 
specific documentation schema.

Oliver is correct that you can't depend upon Function.prototype.toString 
actually reproduce such a structure, but it is a pretty good fallback source 
for a runtime tool to try when it can't find the documentation anywhere else.

Earlier in this thread I was stressing that it is desirable to make it 
impossible for application logic to have dependencies upon such metadata. This 
approach satisfies that requirement.  In fact, if this convention was 
established I would expect minimizers to strip out any such documentation.

Given that you can't depend upon the documentation to be in the actual 
downloaded source code runtime tools need a convention for finding the 
documentation.  I suggest above that  such a documentation block could easily 
be translated into JSON.  Such a convention might be something like that given 
a executed file located at http:somepath/foo.js or http:somepath/foo.min.js 
the file http:somepath/foo.js.doc.json contains the documentation objects for 
the file.  Of source, someone needs to write a documentation extractor to 
produce such files.

Allen


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


Re: __doc__ for functions, classes, objects etc.

2011-09-03 Thread Brendan Eich
On Sep 6, 2011, at 12:36 AM, Dmitry Soshnikov wrote:

 So, IMO we can't build a library on hacks which we then standardize. If to 
 implement, then the best approach at the lower level, as Python did (with 
 processing at compilation time).

I see no reason why we can't build up a library or competing libraries first, 
then standardize. Sure, it would be easier for the library implementors if 
there were standard low-level doc-string or doc-comment (or doc-data as Allen 
just posted) plumbing.

But JS can host all sorts of hacks to front a uniform cross-browser/version API 
-- this has been going on at least since the Ajax days.

The hard thing about standardizing first is that TC39 won't do as good a job as 
competing library authors contending for users, but TC39 de-jure 
standardization will result in everyone being stuck with whatever we invent.

Did you have a concrete lower-level suggestion that does not depend on 
normative language prohibiting dead code elimination combined with 
Function.prototype.toString() standardization?

/be

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


Re: __doc__ for functions, classes, objects etc.

2011-09-03 Thread Dmitry Soshnikov

On 03.09.2011 22:53, Allen Wirfs-Brock wrote:


On Sep 2, 2011, at 3:29 PM, Irakli Gozalishvili wrote:



https://github.com/Gozala/doc



I want to second Brendan on the coolness of this.  It really is a 
JavaScript derived solution rather than simply copying what somebody 
else did for some other language.


Ah, come on! _* Are we here talking about a coolness?

Seems we started from the beginning that we have some _problems_ that: 
(1) `toString` is not standardized and (2) a consequence from (1) -- 
some engines removes some code-parts from sources at toString 
representation. We started the thread that we have the _issue_ of the 
topic and that even though we may use some _hacks_ for such _toy ad-hoc_ 
implementations, still these implementations are nevertheless stay 
_toys_ -- as a quick prototype -- to show a proposed feature. We started 
from that it would be great to have such a thing available at _lower_ level.


We also said that _exact syntax_ and similar coolness is not a main 
part of the proposal. That the ability to have the thing _embedded_ and 
to get the help in the _consistent_ way -- is the main part.


From all this, I'd already better propose to standardize then 
`toString` of functions. _Then_ you may organize some competitions or 
a cool syntax in a JavaScript derived way. But this is completely 
different story. However, even from this viewpoint it's more practical 
to chose the solution which is here for years -- i.e. the syntax of 
JavaDocs, which, once again, will turn-on the documentation for tones of 
old code.


If the `toString` will be standardized, we may easily implement the 
solution as a runtime library (though, good bye documenting of 
built-ins!). If not, the only consistent and efficient behavior -- is to 
have it as a pre-processor and to inject the doc-comment to AST for 
function declarations.


May I at least ask, whether it makes sense to talk about `toString` 
standardization? (because unfortunately this topic doesn't move forward 
as I see -- don't want to have the docs for built-ins? -- as you wish, I 
just proposed; though, ES don't even have a big standard library to 
provide a detailed built-in documentation).


(don't get me wrong, I'm just trying to clarify the main goal of the 
proposal; and for a library, standardizing of `toString` would be enough 
and we may just close the topic)




I have a couple of thoughts  to throw in.

The documentation description doesn't need to be a single structured 
string.  It could also be something like:


   function sum(x, y) {

doc: {
  name: sum;
  parameters: {
x: first value to sum; expected: Number;
y: second value to sum; expected: Number;
  }
  returns: Number;
  description: Compute the sum of two numbers;
  docUrl: http://maysite.com/myapp/designDoc.html#sum;;
}

return x + y;

   }

This doc blocks looks something like an object literal but is really 
composed of  nested labelled blocks and statements.  However, it would 
be pretty easy to translate such a structure into a JSON object structure.




Yes, for a runtime library seems an elegant solution. Though, again, it 
will be hard to force people just stop using the doc-style they are used 
to use and to switch them to package-description style in a JSON 
format. Though, I agree that this version looks nice. But, again -- the 
original proposal wasn't about it, because we _had_ (before starting the 
topic) working hacks that the runtime lib just works. But nobody needs 
hacks. Everybody wants a convenient documentation syntax for which there 
are already many parser of the auto-docs generations.


Whether a string or a structured labeled block is used, if we hope for 
multiple tools and IDEs to support it then somebody needs to propose 
and promote a specific documentation schema.


Oliver is correct that you can't depend upon 
Function.prototype.toString actually reproduce such a structure, but 
it is a pretty good fallback source for a runtime tool to try when it 
can't find the documentation anywhere else.




So, can we just standardize `toString` instead?

Dmitry.

Earlier in this thread I was stressing that it is desirable to make it 
impossible for application logic to have dependencies upon such 
metadata. This approach satisfies that requirement.  In fact, if this 
convention was established I would expect minimizers to strip out any 
such documentation.


Given that you can't depend upon the documentation to be in the actual 
downloaded source code runtime tools need a convention for finding the 
documentation.  I suggest above that  such a documentation block could 
easily be translated into JSON.  Such a convention might be something 
like that given a executed file located at http:somepath/foo.js or 
http:somepath/foo.min.js the file http:somepath/foo.js.doc.json 
contains the documentation objects for the file.  Of source, someone 
needs to 

Re: __doc__ for functions, classes, objects etc.

2011-09-03 Thread Dmitry Soshnikov

On 04.09.2011 0:31, Brendan Eich wrote:

On Sep 6, 2011, at 12:36 AM, Dmitry Soshnikov wrote:


So, IMO we can't build a library on hacks which we then standardize. If to 
implement, then the best approach at the lower level, as Python did (with processing at 
compilation time).

I see no reason why we can't build up a library or competing libraries first, 
then standardize. Sure, it would be easier for the library implementors if 
there were standard low-level doc-string or doc-comment (or doc-data as Allen 
just posted) plumbing.

But JS can host all sorts of hacks to front a uniform cross-browser/version API -- this 
has been going on at least since the Ajax days.

The hard thing about standardizing first is that TC39 won't do as good a job as 
competing library authors contending for users, but TC39 de-jure 
standardization will result in everyone being stuck with whatever we invent.



Sure, it's true, the way to standardize de-facto things is very 
efficient and practical. Though, sometimes without low-level resources 
it's not always possible to implement a library in an elegant way. And 
to standardize hacks... don't know. Not sure it's the best idea.



Did you have a concrete lower-level suggestion that does not depend on 
normative language prohibiting dead code elimination combined with 
Function.prototype.toString() standardization?



I have several concrete lower-level proposals:

(1) to standardize `toString` (for this particular case -- do not remove 
comments inside);


If the (1) is not possible (why by the way?), then we can:

(2) either to change grammar for function declarations/expression (to 
add Documentation production before the `function` token; though, not so 
convinient for FE, when e.g. foo: function () { ... })


(3) make a pre-parsing of doc-comments and to inject them as a 
properties of functions. I gave an example of such a pre-processor (just 
a small prototype, but it can generate the docs and type-guards) -- 
https://gist.github.com/1186853


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


Re: __doc__ for functions, classes, objects etc.

2011-09-02 Thread Dmitry Soshnikov

On 01.09.2011 22:28, Dmitry A. Soshnikov wrote:

On 31.08.2011 18:38, Allen Wirfs-Brock wrote:

On Aug 31, 2011, at 1:57 AM, Dmitry A. Soshnikov wrote:


On 30.08.2011 20:39, Allen Wirfs-Brock wrote:

On Aug 30, 2011, at 12:39 AM, Dmitry A. Soshnikov wrote:

OK, let's up the topic. Seems there are no technical issues in the 
proposed thing -- we can simply either accept it or not. The 
question is whether it's needed and sound proposal and the feature 
to have in ECMAScript.

There certainly are technical issues.

To start, by making this part of the core language you would be 
defining a feature that can be used by any application code.  For 
example, a program might choose to encode essential runtime 
metadata as its documentation.  Because of that possibility, the 
[[Documentation]] information must always be available at runtime.  
Minimizers or obfuscators could not remote documentation comments 
because of the possibility of breaking such programs.
Sure, though I don't think that application level code have to be 
dependent in logic on documentation string. The doc-string is just 
the _addition for debug_. No more, no less. It's when you use a new 
lib (my example with Redis's `get` method which should accept 
callback), you just get this help directly from here without going 
to some websites (which can even be down for this time) and solve 
the problems much faster. And for minified scripts, I think the 
option Remove doc-comments is the case.
When designing language features, a designer always has some specific 
use cases in mind.  But that doesn't restrict users of the language 
from discovering other use cases. Once a feature is  incorporated 
into a language, implementation have to support all possible use 
cases, not just the original intended use case.   That's why it is 
important for language designer to think broadly about all 
conceivable uses and feature interaction when extending a language. 
Sure, no application is required to have logic dependencies upon the 
content of a documentation string but once they exist any application 
could have such dependencies. As a language designers you have to 
think about the implications of such usages.  It isn't good enough to 
just say that wasn't the intended use of the feature.




Yes, of course it's true, we have to consider the most hardcore 
use-cases of our programs. Well, then I have to think on it, but the 
first thing which comes in mind -- already mentioned Remove 
doc-comments option for minifiers, i.e. a user himself is responsible 
for this action.



By the way, another solution is to use another prologue directive:

use documentation;

or vice-versa, no documentation; since it would be better to turn-off 
the feature, but by default to have it in the console, tests and debug.


P.S.: want to embed the source-code transformation script I gave into 
Narcissus as an extension (e.g. an option for compilation)?


njs script.js --with-doc

Dmitry.

Moreover, minification is again mostly for browser-scripting, where 
this help(...) functionality isn't so required as it is for the server 
programming in the console.


And for the later case I wrote a simple version of such a 
pre-processor: https://gist.github.com/1186853


Simple example:

/**
 * sum
 * @param {Number} x
 * @param {Number} y
 * The function of summation.
 */
function sum(x, y) {
  return x + y;
}

/**
 * multSum
 * @param {Number} x
 * @param {Number} y
 * @param {String} value
 * The function of calculation.
 */
function calculate(x, y, value) {
  // comment
  print(value + :  + sum(x, y));
}

// -- Test documentation --

// Result:

// Help on sum function:
//
// /**
//  * sum
//  * @param {Number} x
//  * @param {Number} y
//  * The function of summation.
//  */
help(sum);

// Help on calculate function:
//
// /**
//  * multSum
//  * @param {Number} x
//  * @param {Number} y
//  * @param {String} value
//  * The function of calculation.
//  */
help(calculate);

// -- Test guards --

sum(1, 2); // 3, OK

calculate(1, 2, value); // value: 3

sum(1, 2); // TypeError: y must be a number

calculate(1, 2, 4); // TypeError: value must be a string

Dmitry.



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


__doc__ for functions, classes, objects etc.

2011-09-02 Thread Irakli Gozalishvili
I also prototyped this idea mainly for node. Also, I figured out a hack with
a label, that make it work for spidermonkey.


Regards
--
Irakli Gozalishvili
Web: http://www.jeditoolkit.com/
Address: 29 Rue Saint-Georges, 75009 Paris, France http://goo.gl/maps/3CHu

On Thursday, 2011-09-01 at 20:28 , Dmitry A. Soshnikov wrote:

On 31.08.2011 18:38, Allen Wirfs-Brock wrote:

On Aug 31, 2011, at 1:57 AM, Dmitry A. Soshnikov wrote:

On 30.08.2011 20:39, Allen Wirfs-Brock wrote:

On Aug 30, 2011, at 12:39 AM, Dmitry A. Soshnikov wrote:

OK, let's up the topic. Seems there are no technical issues in the proposed
thing -- we can simply either accept it or not. The question is whether it's
needed and sound proposal and the feature to have in ECMAScript.

There certainly are technical issues.

To start, by making this part of the core language you would be defining a
feature that can be used by any application code. For example, a program
might choose to encode essential runtime metadata as its documentation.
Because of that possibility, the [[Documentation]] information must always
be available at runtime. Minimizers or obfuscators could not remote
documentation comments because of the possibility of breaking such programs.

Sure, though I don't think that application level code have to be dependent
in logic on documentation string. The doc-string is just the _addition for
debug_. No more, no less. It's when you use a new lib (my example with
Redis's `get` method which should accept callback), you just get this help
directly from here without going to some websites (which can even be down
for this time) and solve the problems much faster. And for minified scripts,
I think the option Remove doc-comments is the case.

When designing language features, a designer always has some specific use
cases in mind. But that doesn't restrict users of the language from
discovering other use cases. Once a feature is incorporated into a language,
implementation have to support all possible use cases, not just the original
intended use case. That's why it is important for language designer to think
broadly about all conceivable uses and feature interaction when extending a
language. Sure, no application is required to have logic dependencies upon
the content of a documentation string but once they exist any application
could have such dependencies. As a language designers you have to think
about the implications of such usages. It isn't good enough to just say that
wasn't the intended use of the feature.

Yes, of course it's true, we have to consider the most hardcore
use-cases of our programs. Well, then I have to think on it, but the
first thing which comes in mind -- already mentioned Remove
doc-comments option for minifiers, i.e. a user himself is responsible
for this action. Moreover, minification is again mostly for
browser-scripting, where this help(...) functionality isn't so required
as it is for the server programming in the console.

And for the later case I wrote a simple version of such a pre-processor:
https://gist.github.com/1186853

Simple example:

/**
* sum
* @param {Number} x
* @param {Number} y
* The function of summation.
*/
function sum(x, y) {
return x + y;
}

/**
* multSum
* @param {Number} x
* @param {Number} y
* @param {String} value
* The function of calculation.
*/
function calculate(x, y, value) {
// comment
print(value + :  + sum(x, y));
}

// -- Test documentation --

// Result:

// Help on sum function:
//
// /**
// * sum
// * @param {Number} x
// * @param {Number} y
// * The function of summation.
// */
help(sum);

// Help on calculate function:
//
// /**
// * multSum
// * @param {Number} x
// * @param {Number} y
// * @param {String} value
// * The function of calculation.
// */
help(calculate);

// -- Test guards --

sum(1, 2); // 3, OK

calculate(1, 2, value); // value: 3

sum(1, 2); // TypeError: y must be a number

calculate(1, 2, 4); // TypeError: value must be a string

Dmitry.

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



-- 
Regards
--
Irakli Gozalishvili
Web: http://www.jeditoolkit.com/
Address: 29 Rue Saint-Georges, 75009 Paris, France http://goo.gl/maps/3CHu
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: __doc__ for functions, classes, objects etc.

2011-09-02 Thread Brendan Eich
On Sep 2, 2011, at 3:29 PM, Irakli Gozalishvili wrote:

 On Friday, 2011-09-02 at 22:28 , Brendan Eich wrote:
 Can you show your label hack for SpiderMonkey to es-discuss?
 
 
 Ahh sorry I did not realized I forgot to post link:
 
 https://github.com/Gozala/doc 

Cool! Permit me to cite some of your README content to help promote to those 
who did not click ;-) -- here it is:

var doc = require('doc').doc
doc(doc) // Prints following output:

/*
function doc(source) { ... }
---
Prints documentanion of the given function
*/

// You can also document your own functions:

function compose() {
  doc: Returns the composition of a list of functions, where each function
 | consumes the return value of the function that follows. In math
 | terms, composing the functions `f()`, `g()`, and `h()` produces
 | `f(g(h()))`.
 | Usage:
 | var greet = function(name) { return 'hi: ' + name }
 | var exclaim = function(statement) { return statement + '!' }
 | var welcome = compose(exclaim, greet)
 | welcome('moe')
 | // 'hi: moe!'

  var funcs = Array.prototype.slice.call(arguments)
  return function composed() {
var args = slice.call(arguments)
var i = funcs.length
while (0 = --i) args = [ funcs[i].apply(this, args) ]
return args[0]
  }
}

/be

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


Re: __doc__ for functions, classes, objects etc.

2011-09-02 Thread Oliver Hunt

On Sep 2, 2011, at 3:41 PM, Brendan Eich wrote:

 On Sep 2, 2011, at 3:29 PM, Irakli Gozalishvili wrote:
 
 On Friday, 2011-09-02 at 22:28 , Brendan Eich wrote:
 Can you show your label hack for SpiderMonkey to es-discuss?
 
 
 Ahh sorry I did not realized I forgot to post link:
 
 https://github.com/Gozala/doc 
 
 Cool! Permit me to cite some of your README content to help promote to those 
 who did not click ;-) -- here it is:
 
 var doc = require('doc').doc
 doc(doc) // Prints following output:
 
 /*
 function doc(source) { ... }
 ---
 Prints documentanion of the given function
 */
 
 // You can also document your own functions:
 
 function compose() {
   doc: Returns the composition of a list of functions, where each function
  | consumes the return value of the function that follows. In math
  | terms, composing the functions `f()`, `g()`, and `h()` produces
  | `f(g(h()))`.
  | Usage:
  | var greet = function(name) { return 'hi: ' + name }
  | var exclaim = function(statement) { return statement + '!' }
  | var welcome = compose(exclaim, greet)
  | welcome('moe')
  | // 'hi: moe!'

Function.toString isn't standardised, and I recall that in the past SM did 
elide dead code, multiple engines reformat code, so in general this doesnt seem 
reliable at a library level.  It also doesn't work for builtin functions, and I 
feel we'd want a solution that allows documentation for builtin functions as 
well.

From the pov of runtime identification, we'd be in the odd position of having 
to try and identify valid code as being documentation.

This shouldn't be taken as support for this idea (documentation as part of the 
language) as I feel that this is the type of feature i'd associate with the 
development environment rather than part of the language.

--Oliver

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


Re: __doc__ for functions, classes, objects etc.

2011-09-02 Thread Rick Waldron
While we're sharing... I've also written an implementation, albiet much
simpler in form then Dmitry's or Irakli's, but this will work in ES today as
is, using old-time multi-line and single line comments.


https://gist.github.com/1160879


Rick




On Fri, Sep 2, 2011 at 6:41 PM, Brendan Eich bren...@mozilla.com wrote:

 On Sep 2, 2011, at 3:29 PM, Irakli Gozalishvili wrote:

 On Friday, 2011-09-02 at 22:28 , Brendan Eich wrote:

 Can you show your label hack for SpiderMonkey to es-discuss?


 Ahh sorry I did not realized I forgot to post link:

 https://github.com/Gozala/doc


 Cool! Permit me to cite some of your README content to help promote to
 those who did not click ;-) -- here it is:

 var doc = require('doc').docdoc(doc) // Prints following output:
 /*function doc(source) { ... 
 }---Prints documentanion of the 
 given function*/
 // You can also document your own functions:
 function compose() {
   doc: Returns the composition of a list of functions, where each function
  | consumes the return value of the function that follows. In math
  | terms, composing the functions `f()`, `g()`, and `h()` produces
  | `f(g(h()))`.
  | Usage:
  | var greet = function(name) { return 'hi: ' + name }
  | var exclaim = function(statement) { return statement + '!' }
  | var welcome = compose(exclaim, greet)
  | welcome('moe')
  | // 'hi: moe!'

   var funcs = Array.prototype.slice.call(arguments)
   return function composed() {
 var args = slice.call(arguments)
 var i = funcs.length
 while (0 = --i) args = [ funcs[i].apply(this, args) ]
 return args[0]
   }}


 /be


 ___
 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: __doc__ for functions, classes, objects etc.

2011-09-02 Thread Rick Waldron
Also, mine will suffer from the same downfall noted in Oliver's
comments.. Function.toString
isn't standardised, and I recall that in the past SM did elide dead code

On Fri, Sep 2, 2011 at 6:56 PM, Rick Waldron waldron.r...@gmail.com wrote:

 While we're sharing... I've also written an implementation, albiet much
 simpler in form then Dmitry's or Irakli's, but this will work in ES today as
 is, using old-time multi-line and single line comments.


 https://gist.github.com/1160879


 Rick




  On Fri, Sep 2, 2011 at 6:41 PM, Brendan Eich bren...@mozilla.com wrote:

  On Sep 2, 2011, at 3:29 PM, Irakli Gozalishvili wrote:

 On Friday, 2011-09-02 at 22:28 , Brendan Eich wrote:

 Can you show your label hack for SpiderMonkey to es-discuss?


 Ahh sorry I did not realized I forgot to post link:

 https://github.com/Gozala/doc


 Cool! Permit me to cite some of your README content to help promote to
 those who did not click ;-) -- here it is:

 var doc = require('doc').docdoc(doc) // Prints following output:
 /*function doc(source) { ... 
 }---Prints documentanion of the 
 given function*/
 // You can also document your own functions:
 function compose() {
   doc: Returns the composition of a list of functions, where each function
  | consumes the return value of the function that follows. In math
  | terms, composing the functions `f()`, `g()`, and `h()` produces
  | `f(g(h()))`.
  | Usage:
  | var greet = function(name) { return 'hi: ' + name }
  | var exclaim = function(statement) { return statement + '!' }
  | var welcome = compose(exclaim, greet)
  | welcome('moe')
  | // 'hi: moe!'

   var funcs = Array.prototype.slice.call(arguments)
   return function composed() {
 var args = slice.call(arguments)
 var i = funcs.length
 while (0 = --i) args = [ funcs[i].apply(this, args) ]
 return args[0]
   }}


 /be


 ___
 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: __doc__ for functions, classes, objects etc.

2011-09-02 Thread Brendan Eich
On Sep 2, 2011, at 3:55 PM, Oliver Hunt wrote:

 Function.toString isn't standardised, and I recall that in the past SM did 
 elide dead code, multiple engines reformat code, so in general this doesnt 
 seem reliable at a library level.  It also doesn't work for builtin 
 functions, and I feel we'd want a solution that allows documentation for 
 builtin functions as well.

Oh sure, Irakli is just making do with what happens to work. SpiderMonkey 
doesn't do source recovery, so it needs something special and the label hack 
Irakli found is it (for now!).

This thread was about standardizing something guaranteed that does not depend 
on toString, but we would love to have a winning library approach whose API we 
can standardize. Such a library could be scrappy (I hope not crappy ;-) about 
using what happens to work on particular engines and even versions.


 This shouldn't be taken as support for this idea (documentation as part of 
 the language) as I feel that this is the type of feature i'd associate with 
 the development environment rather than part of the language.

That's the other thing about a library approach: it doesn't need to land in 
language, but then the IDE may have to grow a full parser (probably good IDEs 
already have one).

/be

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


Re: __doc__ for functions, classes, objects etc.

2011-09-02 Thread Irakli Gozalishvili


On Saturday, 2011-09-03 at 24:55 , Oliver Hunt wrote:

 
 On Sep 2, 2011, at 3:41 PM, Brendan Eich wrote:
  On Sep 2, 2011, at 3:29 PM, Irakli Gozalishvili wrote:
   On Friday, 2011-09-02 at 22:28 , Brendan Eich wrote:
Can you show your label hack for SpiderMonkey to es-discuss?

   
   Ahh sorry I did not realized I forgot to post link:
   
   https://github.com/Gozala/doc 
  Cool! Permit me to cite some of your README content to help promote to 
  those who did not click ;-) -- here it is:
  
  var doc = require('doc').doc doc(doc) // Prints following output: /* 
  function doc(source) { ... } 
  --- Prints documentanion of the 
  given function */ // You can also document your own functions: function 
  compose() { doc: Returns the composition of a list of functions, where 
  each function | consumes the return value of the function that follows. 
  In math | terms, composing the functions `f()`, `g()`, and `h()` 
  produces | `f(g(h()))`. | Usage: | var greet = function(name) { 
  return 'hi: ' + name } | var exclaim = function(statement) { return 
  statement + '!' } | var welcome = compose(exclaim, greet) | 
  welcome('moe') | // 'hi: moe!' 
 
 Function.toString isn't standardised, and I recall that in the past SM did 
 elide dead code, multiple engines reformat code, so in general this doesnt 
 seem reliable at a library level. 

Yeap toString is not reliable, but hey it works just fine on most engines I 
know ;) Also SM strips out dec code that's why I use label hack so that it 
keeps it :) 

 It also doesn't work for builtin functions, and I feel we'd want a solution 
 that allows documentation for builtin functions as well.
 
 
 


In fact `doc` function will work with built-ins just fine, even though output 
is not that useful:

 doc(Array.prototype.slice)

 function slice($1, $2) { ... }


 
 From the pov of runtime identification, we'd be in the odd position of having 
 to try and identify valid code as being documentation.
 
 This shouldn't be taken as support for this idea (documentation as part of 
 the language) as I feel that this is the type of feature i'd associate with 
 the development environment rather than part of the language.
 
 --Oliver

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


Re: __doc__ for functions, classes, objects etc.

2011-09-01 Thread Dmitry A. Soshnikov

On 31.08.2011 18:38, Allen Wirfs-Brock wrote:

On Aug 31, 2011, at 1:57 AM, Dmitry A. Soshnikov wrote:


On 30.08.2011 20:39, Allen Wirfs-Brock wrote:

On Aug 30, 2011, at 12:39 AM, Dmitry A. Soshnikov wrote:


OK, let's up the topic. Seems there are no technical issues in the proposed 
thing -- we can simply either accept it or not. The question is whether it's 
needed and sound proposal and the feature to have in ECMAScript.

There certainly are technical issues.

To start, by making this part of the core language you would be defining a feature that 
can be used by any application code.  For example, a program might choose to encode 
essential runtime metadata as its documentation.  Because of that 
possibility, the [[Documentation]] information must always be available at runtime.  
Minimizers or obfuscators could not remote documentation comments because of the 
possibility of breaking such programs.

Sure, though I don't think that application level code have to be dependent in logic on 
documentation string. The doc-string is just the _addition for debug_. No more, no less. It's when 
you use a new lib (my example with Redis's `get` method which should accept callback), you just get 
this help directly from here without going to some websites (which can even be down for 
this time) and solve the problems much faster. And for minified scripts, I think the option 
Remove doc-comments is the case.

When designing language features, a designer always has some specific use cases 
in mind.  But that doesn't restrict users of the language from discovering 
other use cases. Once a feature is  incorporated into a language, 
implementation have to support all possible use cases, not just the original 
intended use case.   That's why it is important for language designer to think 
broadly about all conceivable uses and feature interaction when extending a 
language. Sure, no application is required to have logic dependencies upon the 
content of a documentation string but once they exist any application could 
have such dependencies. As a language designers you have to think about the 
implications of such usages.  It isn't good enough to just say that wasn't the 
intended use of the feature.



Yes, of course it's true, we have to consider the most hardcore 
use-cases of our programs. Well, then I have to think on it, but the 
first thing which comes in mind -- already mentioned Remove 
doc-comments option for minifiers, i.e. a user himself is responsible 
for this action. Moreover, minification is again mostly for 
browser-scripting, where this help(...) functionality isn't so required 
as it is for the server programming in the console.


And for the later case I wrote a simple version of such a pre-processor: 
https://gist.github.com/1186853


Simple example:

/**
 * sum
 * @param {Number} x
 * @param {Number} y
 * The function of summation.
 */
function sum(x, y) {
  return x + y;
}

/**
 * multSum
 * @param {Number} x
 * @param {Number} y
 * @param {String} value
 * The function of calculation.
 */
function calculate(x, y, value) {
  // comment
  print(value + :  + sum(x, y));
}

// -- Test documentation --

// Result:

// Help on sum function:
//
// /**
//  * sum
//  * @param {Number} x
//  * @param {Number} y
//  * The function of summation.
//  */
help(sum);

// Help on calculate function:
//
// /**
//  * multSum
//  * @param {Number} x
//  * @param {Number} y
//  * @param {String} value
//  * The function of calculation.
//  */
help(calculate);

// -- Test guards --

sum(1, 2); // 3, OK

calculate(1, 2, value); // value: 3

sum(1, 2); // TypeError: y must be a number

calculate(1, 2, 4); // TypeError: value must be a string

Dmitry.

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


Re: __doc__ for functions, classes, objects etc.

2011-08-31 Thread Dmitry A. Soshnikov

On 30.08.2011 19:33, Dean Landolt wrote:



On Tue, Aug 30, 2011 at 10:41 AM, Dmitry A. Soshnikov 
dmitry.soshni...@gmail.com mailto:dmitry.soshni...@gmail.com wrote:


On 30.08.2011 17:41, Rick Waldron wrote:

On Tue, Aug 30, 2011 at 3:39 AM, Dmitry A. Soshnikov
dmitry.soshni...@gmail.com mailto:dmitry.soshni...@gmail.com
wrote:

OK, let's up the topic. Seems there are no technical issues
in the proposed thing -- we can simply either accept it or
not. The question is whether it's needed and sound proposal
and the feature to have in ECMAScript.

Some summarized features below:

+ Ability to get help of any built-in and any user-defined
function directly in runtime (in later case, authors should
provide the documentations though)
+ Auto-suggest and hints of parameters and their types when
typing function name in console.
+ Ability even to have sort of guards for types with issuing
warnings in case if types mismatch (sort of recent
contract.coffee projects and actually other langs, e.g.
Haskell, Erlang, etc).
- Code size will be increased to store the doc string. This
can be optional in case of minimized scripts (lint tools can
have option Remove doc-comments)

As an example I show a spec description for `parseInt` function:

15.1.2.2 parseInt (string , radix)

Let [[Documentation]] property of the `parseInt` function be
the following string:

The parseInt function produces an integer value dictated by
interpretation of the contents of the string argument
according to the specified radix. Leading white space in
string is ignored. If radix is undefined or 0, it is assumed
to be 10 except when the number begins with the character
pairs 0x or 0X, in which case a radix of 16 is assumed. If
radix is 16, number may also optionally begin with the
character pairs 0x or 0X.

...

x.x.xx help(F)


A built-in, global object function property named help() will
no doubt conflict with userland code




It's derived question, we may choose any name which fits well
(though, IMO `help` name isn't used much).



That's tough to say for sure, and even if true still probably isn't 
good enough. Regardless, there's no excuse for this kind of global, 
especially in light of a module system. Sure, specifically in a repl 
you'd probably want to skip the require -- for this node offers up 
dot-prefixed repl keywords. So something like .help(F) would be a lot 
safer and nearly as convenience as a help global.




Yes, I guess. Anyway, all this about only debug-in-console mode, so 
.help(...) would be just fine.


I think it would be useful for the committee to weigh in on the idea 
of repl plugins. This particular design is pretty nice but it 
conflicts for statements beginning with non-zero-prefixed decimals. In 
practice I don't see this causing any real problems, but it'd be great 
if the grammer explicitly forbid this, effectively reserving it for 
repl hooks.




Maybe, though, in contrast with other langs, ES is different since 
because of browser vendors has different implementations. Actually, 
there is no such implementation as ECMAScript. In contrast, languages 
such as e.g. Python or Erlang have the sample implementations (usually 
that which is placed directly on the website of the language), and there 
of course the attention to a good console and downloadable and 
installable in one click REPLs is paid much. And that's said, this 
increases and speeds up the learning of the language. I don't know what 
to propose in case of ECMAScript, since repeat, there is no such 
language as ECMAScript in real life and therefore, there is no the 
sample REPL for which it would be the best to have .help(...) function 
which shows the doc-comment of a function.


And in case of a browser -- I don't think it's needed much. OTOH, of 
course devs. also debug the browser code in tools such as Firebug, where 
they also can use this .help(...).


So I'm still thinking myself, is it worth to move it to the level of the 
ES spec (the [[Doc]] property and similar) or it's not needed much and 
is only for playing in console. OTOH, this playing in console is 
what makes Python the best in this respect.



The main thing I want to clarify at this step, whether we need at
all this thing in ES?

Since committee keeps silence, I'd like to consider it better as
Yes, we need it and there is nothing to add, rather than We
don't need and don't want even to discuss (since there is no big
sense in later, because the functionality seems useful). However,
we need to clarify how *exactly* it's useful. Maybe using JS in
console is so rare case and it isn't required much. OTOH, era of
client-side-only-JS is behind and JS is also on server now. And
 

Re: __doc__ for functions, classes, objects etc.

2011-08-31 Thread Dmitry A. Soshnikov

On 30.08.2011 19:54, Rick Waldron wrote:



On Tue, Aug 30, 2011 at 10:41 AM, Dmitry A. Soshnikov 
dmitry.soshni...@gmail.com mailto:dmitry.soshni...@gmail.com wrote:


On 30.08.2011 17:41, Rick Waldron wrote:

On Tue, Aug 30, 2011 at 3:39 AM, Dmitry A. Soshnikov
dmitry.soshni...@gmail.com mailto:dmitry.soshni...@gmail.com
wrote:

OK, let's up the topic. Seems there are no technical issues
in the proposed thing -- we can simply either accept it or
not. The question is whether it's needed and sound proposal
and the feature to have in ECMAScript.

Some summarized features below:

+ Ability to get help of any built-in and any user-defined
function directly in runtime (in later case, authors should
provide the documentations though)
+ Auto-suggest and hints of parameters and their types when
typing function name in console.
+ Ability even to have sort of guards for types with issuing
warnings in case if types mismatch (sort of recent
contract.coffee projects and actually other langs, e.g.
Haskell, Erlang, etc).
- Code size will be increased to store the doc string. This
can be optional in case of minimized scripts (lint tools can
have option Remove doc-comments)

As an example I show a spec description for `parseInt` function:

15.1.2.2 parseInt (string , radix)

Let [[Documentation]] property of the `parseInt` function be
the following string:

The parseInt function produces an integer value dictated by
interpretation of the contents of the string argument
according to the specified radix. Leading white space in
string is ignored. If radix is undefined or 0, it is assumed
to be 10 except when the number begins with the character
pairs 0x or 0X, in which case a radix of 16 is assumed. If
radix is 16, number may also optionally begin with the
character pairs 0x or 0X.

...

x.x.xx help(F)


A built-in, global object function property named help() will
no doubt conflict with userland code




It's derived question, we may choose any name which fits well
(though, IMO `help` name isn't used much). The main thing I want
to clarify at this step, whether we need at all this thing in ES?


I support this idea :)

BTW, here are some incomplete numbers on help() (sort of)
http://www.google.com/codesearch#search/q=lang:%5Ejavascript$%20help%5C(type=cs 
http://www.google.com/codesearch#search/q=lang:%5Ejavascript$%20help%5C%28type=cs


OK, OK, you've convinced me ;) it's used much as I see. Though, would be 
the best name. Function.getDocumentation(...) is also nice but long. 
Funciton.getInfo(...) may return an object with meta-info: 
{documentation: ..., length: 2, arguments: {a: int, b: string}}. 
But don't wanna go down into the bikeshed.


Dmitry.



Since committee keeps silence, I'd like to consider it better as
Yes, we need it and there is nothing to add, rather than We
don't need and don't want even to discuss (since there is no big
sense in later, because the functionality seems useful). However,
we need to clarify how *exactly* it's useful. Maybe using JS in
console is so rare case and it isn't required much. OTOH, era of
client-side-only-JS is behind and JS is also on server now. And
from this viewpoint, in the console, it's the best to get the
help, hints for parameters and even type checking for functions.

So, what should I do to apply the first meaning?

Dmitry.




When the `help` function is called on the F object, the
following steps are taken:

1. If [[Class]] of the function is not Function throw TypeError
2. Let doc be [[Documentation]] property of F
   2.1 If doc is `undefined` return empty string
   2.2. return String(doc)

It's a simplified version of course (moreover, Allen wanted
to eliminate [[Class]], so -- it's just an example).

Do we need this?

Dmitry.


On 09.08.2011 23:59, Dmitry A. Soshnikov wrote:

On 23.08.2011 20:54, Brendan Eich wrote:

A convenient notation for multiline documentation
comments, with convenient reflection (*not* via
toString() scraping!), would be a fine thing.


Yes, exactly this -- help(...) function, and also good
auto-complete of object methods helped me some time ago
formerly to learn Python very quickly just playing with
it in console. By the way, ECMAScript (who will take
responsibility to implement the ECMAScript -- ethanol
implementation? :)) also needs some installation binaries
with the console. And yes -- with this great features for
learning -- auto-complete of methods (the best thing to
   

Re: __doc__ for functions, classes, objects etc.

2011-08-31 Thread Dmitry A. Soshnikov
Right. And this is where Python just wins. In respect of bult-ins and 
methods provided by framework authors. That's said in the initial 
letter, we can always go to the language documentation website and read 
it, but to the help in-place seems much better.


Though, there is another issue here (beside the source- and byte- code 
size increasing). The offline documentation embedded inside the 
function objects may become obsolete, while the online is up-to-date. 
But, for the specified built-ins it's not the case, since the spec 
doesn't change too often. And regarding user-defined framework codes, 
anyway the code is parsed each time -- it is the property and the deal 
of the JS engine to correctly parse doc-comment and assign it as a 
property to a function. That is, the documentation may change in-time 
and if you use external script file, then you always have up-to-date 
documentation.


Dmitry.


On 30.08.2011 20:09, Dave Fugate wrote:


This feature is particularly useful for /framework/ authors and their 
users.  Countless times I've found myself using a browser's console 
debugging tool to figure out why something's busted.  In these cases, 
I nearly always resort to navigating to some JS framework's website 
for their documentation or scrutinizing their code directly to figure 
out what's going wrong.  If I could just call 
'printHelp(xyzsomeMethod)', less of my time would be used.  The 
other bit of utility here is that framework documentation can live 
side-by-side with the code and be automatically generated from it 
(e.g., http://pydoc.org/2.5.1/timeit.html) as opposed to maintaining 
it separately.  A very useful feature to have from my Python-biased 
perspectiveJ


My best,

Dave

*From:*es-discuss-boun...@mozilla.org 
[mailto:es-discuss-boun...@mozilla.org] *On Behalf Of *Dmitry A. Soshnikov

*Sent:* Tuesday, August 30, 2011 7:42 AM
*To:* Rick Waldron
*Cc:* Brendan Eich; es-discuss Steen
*Subject:* Re: __doc__ for functions, classes, objects etc.

On 30.08.2011 17:41, Rick Waldron wrote:

On Tue, Aug 30, 2011 at 3:39 AM, Dmitry A. Soshnikov 
dmitry.soshni...@gmail.com mailto:dmitry.soshni...@gmail.com wrote:


OK, let's up the topic. Seems there are no technical issues in the 
proposed thing -- we can simply either accept it or not. The question 
is whether it's needed and sound proposal and the feature to have in 
ECMAScript.


Some summarized features below:

+ Ability to get help of any built-in and any user-defined function 
directly in runtime (in later case, authors should provide the 
documentations though)
+ Auto-suggest and hints of parameters and their types when typing 
function name in console.
+ Ability even to have sort of guards for types with issuing warnings 
in case if types mismatch (sort of recent contract.coffee projects and 
actually other langs, e.g. Haskell, Erlang, etc).
- Code size will be increased to store the doc string. This can be 
optional in case of minimized scripts (lint tools can have option 
Remove doc-comments)


As an example I show a spec description for `parseInt` function:

15.1.2.2 parseInt (string , radix)

Let [[Documentation]] property of the `parseInt` function be the 
following string:


The parseInt function produces an integer value dictated by 
interpretation of the contents of the string argument according to the 
specified radix. Leading white space in string is ignored. If radix is 
undefined or 0, it is assumed to be 10 except when the number begins 
with the character pairs 0x or 0X, in which case a radix of 16 is 
assumed. If radix is 16, number may also optionally begin with the 
character pairs 0x or 0X.


...

x.x.xx help(F)

A built-in, global object function property named help() will no 
doubt conflict with userland code




It's derived question, we may choose any name which fits well (though, 
IMO `help` name isn't used much). The main thing I want to clarify at 
this step, whether we need at all this thing in ES?


Since committee keeps silence, I'd like to consider it better as Yes, 
we need it and there is nothing to add, rather than We don't need 
and don't want even to discuss (since there is no big sense in later, 
because the functionality seems useful). However, we need to clarify 
how *exactly* it's useful. Maybe using JS in console is so rare case 
and it isn't required much. OTOH, era of client-side-only-JS is behind 
and JS is also on server now. And from this viewpoint, in the console, 
it's the best to get the help, hints for parameters and even type 
checking for functions.


So, what should I do to apply the first meaning?

Dmitry.



When the `help` function is called on the F object, the following
steps are taken:

1. If [[Class]] of the function is not Function throw TypeError
2. Let doc be [[Documentation]] property of F
   2.1 If doc is `undefined` return empty string
   2.2. return String(doc)

It's a simplified version of course (moreover, Allen wanted to
eliminate

Re: __doc__ for functions, classes, objects etc.

2011-08-31 Thread Dmitry A. Soshnikov

On 30.08.2011 20:39, Allen Wirfs-Brock wrote:

On Aug 30, 2011, at 12:39 AM, Dmitry A. Soshnikov wrote:


OK, let's up the topic. Seems there are no technical issues in the proposed 
thing -- we can simply either accept it or not. The question is whether it's 
needed and sound proposal and the feature to have in ECMAScript.

There certainly are technical issues.

To start, by making this part of the core language you would be defining a feature that 
can be used by any application code.  For example, a program might choose to encode 
essential runtime metadata as its documentation.  Because of that 
possibility, the [[Documentation]] information must always be available at runtime.  
Minimizers or obfuscators could not remote documentation comments because of the 
possibility of breaking such programs.


Sure, though I don't think that application level code have to be 
dependent in logic on documentation string. The doc-string is just the 
_addition for debug_. No more, no less. It's when you use a new lib (my 
example with Redis's `get` method which should accept callback), you 
just get this help directly from here without going to some websites 
(which can even be down for this time) and solve the problems much 
faster. And for minified scripts, I think the option Remove 
doc-comments is the case.



Rather than trying to extend the core language, I suggest that this type of 
functionality is better viewed as simply another form of reflection that would 
be best modeled as a kind of Mirror.  It should manifest it self as a module 
that provides access to such mirrors.  For example, you might access it as

   var docMirrorFn = DocMirror.for(fn);
   var helpStr = docMirrorFn.help();
   var helpStrLocalized = docMirrorFn.helpLocale();
   var helpStrI18N = docMirrorFn.helpLocale(someLocale);
   var competeDoc = docMirrorFn.full({format: 'HTML'});
   var src = docMirrorFn.sourceCode;
   // etc.


Yeah, why not. Also is a variant. Though, for the end-user I'd like to 
see all this stuff encapsulated somewhere and to get the needed thing as 
just .help(...). But, yes, it can be done by a host-environment as a 
debugger which provides this .help(...) which inside does this long 
manipulations.



If a REPL provider wants to offer a help command it would implement it by 
accessing an appropriate documentation mirror.


Yes.


The definition of the DocMirror module would define how the appropriate meta 
data is obtained and even alternatives and fall backs for obtaining it that 
does not require direct embedding in the loaded JS code.

My recommendation would be rather than trying to extend to the core language at this 
time,  experiment with defining such a module.  At some point we may be ready to consider 
standardizing such modules but even before that there is nothing preventing 
community adoption of such a convention.


Yes, it's not a problem to write a pre-processor of doc-comments  
(actually we have many auto-doc generation tools for JavaDocs), i.e.:


to turn:

/**
  * connect
  * @param {String} host
  * @param {Number} port
  * Connects to my awesome host
  */
function connect(host, port) { ... }

into the:

function connect(host, port) { ... }
connect.__doc__ = connect\n@param {String} host\n@param {Number} 
port\nConnects to my awesome host


or even into the:

function connect(host, port) {

  // ! pre-processor header !!

  if (typeof host != string) console.warning(connect: host must be a 
string);
  if (typeof port != number) console.warning(connect: port must be a 
number);


  // ! end of pre-processor header !!

  // rest of user-defined implementation

}

it's just a variant of course (we need not to show this embedded checker 
in the `toString` decompilation of a function and to handle prologue 
before for directives), but the general idea is this.


It's not the problem to write such a pre-processor, but pre-processor 
means to do something additional manually by hands before the execution 
and not all users use some building-tools for that. OTOH, we can write 
an extension for e.g. Narcissus to handle it on the engine's level and 
try will it go or not (but something suggests me that it will ;)).


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


Re: __doc__ for functions, classes, objects etc.

2011-08-31 Thread Allen Wirfs-Brock

On Aug 31, 2011, at 1:57 AM, Dmitry A. Soshnikov wrote:

 On 30.08.2011 20:39, Allen Wirfs-Brock wrote:
 On Aug 30, 2011, at 12:39 AM, Dmitry A. Soshnikov wrote:
 
 OK, let's up the topic. Seems there are no technical issues in the proposed 
 thing -- we can simply either accept it or not. The question is whether 
 it's needed and sound proposal and the feature to have in ECMAScript.
 There certainly are technical issues.
 
 To start, by making this part of the core language you would be defining a 
 feature that can be used by any application code.  For example, a program 
 might choose to encode essential runtime metadata as its documentation.  
 Because of that possibility, the [[Documentation]] information must always 
 be available at runtime.  Minimizers or obfuscators could not remote 
 documentation comments because of the possibility of breaking such programs.
 
 Sure, though I don't think that application level code have to be dependent 
 in logic on documentation string. The doc-string is just the _addition for 
 debug_. No more, no less. It's when you use a new lib (my example with 
 Redis's `get` method which should accept callback), you just get this help 
 directly from here without going to some websites (which can even be down 
 for this time) and solve the problems much faster. And for minified scripts, 
 I think the option Remove doc-comments is the case.

When designing language features, a designer always has some specific use cases 
in mind.  But that doesn't restrict users of the language from discovering 
other use cases. Once a feature is  incorporated into a language, 
implementation have to support all possible use cases, not just the original 
intended use case.   That's why it is important for language designer to think 
broadly about all conceivable uses and feature interaction when extending a 
language. Sure, no application is required to have logic dependencies upon the 
content of a documentation string but once they exist any application could 
have such dependencies. As a language designers you have to think about the 
implications of such usages.  It isn't good enough to just say that wasn't the 
intended use of the feature.

Allen

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


Re: __doc__ for functions, classes, objects etc.

2011-08-30 Thread Dmitry A. Soshnikov
OK, let's up the topic. Seems there are no technical issues in the 
proposed thing -- we can simply either accept it or not. The question is 
whether it's needed and sound proposal and the feature to have in 
ECMAScript.


Some summarized features below:

+ Ability to get help of any built-in and any user-defined function 
directly in runtime (in later case, authors should provide the 
documentations though)
+ Auto-suggest and hints of parameters and their types when typing 
function name in console.
+ Ability even to have sort of guards for types with issuing warnings in 
case if types mismatch (sort of recent contract.coffee projects and 
actually other langs, e.g. Haskell, Erlang, etc).
- Code size will be increased to store the doc string. This can be 
optional in case of minimized scripts (lint tools can have option 
Remove doc-comments)


As an example I show a spec description for `parseInt` function:

15.1.2.2 parseInt (string , radix)

Let [[Documentation]] property of the `parseInt` function be the 
following string:


The parseInt function produces an integer value dictated by 
interpretation of the contents of the string argument according to the 
specified radix. Leading white space in string is ignored. If radix is 
undefined or 0, it is assumed to be 10 except when the number begins 
with the character pairs 0x or 0X, in which case a radix of 16 is 
assumed. If radix is 16, number may also optionally begin with the 
character pairs 0x or 0X.


...

x.x.xx help(F)

When the `help` function is called on the F object, the following steps 
are taken:


1. If [[Class]] of the function is not Function throw TypeError
2. Let doc be [[Documentation]] property of F
2.1 If doc is `undefined` return empty string
2.2. return String(doc)

It's a simplified version of course (moreover, Allen wanted to eliminate 
[[Class]], so -- it's just an example).


Do we need this?

Dmitry.

On 09.08.2011 23:59, Dmitry A. Soshnikov wrote:

On 23.08.2011 20:54, Brendan Eich wrote:
A convenient notation for multiline documentation comments, with 
convenient reflection (*not* via toString() scraping!), would be a 
fine thing.




Yes, exactly this -- help(...) function, and also good auto-complete 
of object methods helped me some time ago formerly to learn Python 
very quickly just playing with it in console. By the way, ECMAScript 
(who will take responsibility to implement the ECMAScript -- ethanol 
implementation? :)) also needs some installation binaries with the 
console. And yes -- with this great features for learning -- 
auto-complete of methods (the best thing to investigate objects just 
pressing `tab`) and help(...) function. I remember ES4 had/has the 
REPL, why not ES5? Of course we have all those consoles directly from 
the browsers (and also Node.js REPL), but it could be useful. Anyway, 
it's another topic, just relatively touches help(...) functions.



Some of the design dimensions:

0. Comment vs. string / quasiliteral?

1. function-only, or object literal too -- or any declaration?


I think functions are the main case, yes. Not sure about literals, 
since there are open issues such as, how to document a property (via 
descriptor field?)?


2. Before function, a la javadoc comments, or first thing in body, a 
la the prologue directive idea?


That's said, if before, then we should consider white-spaces and 
newlines after the comment and before the function header (though, as 
well as in the prologue). If before, then tones of old code written 
in javadoc will just work with the new engine. OTOH, this means that 
the exact syntax of javadocs will be standardized at the level of the 
spec (and it's a sound thing -- people will have to write exactly e.g. 
@property that the doc-er catch it correctly. OTOH again -- why not? 
-- to standardize common syntax of documenting functions). However, 
the spec may not parse the exact content of the comment but just save 
it as a string, regardless of what is written insides.


A variant with inside is also good, underlines that the comment is 
sort of a function's property (I like yours simple doc name for 
that). Both variants are good, just outside has the advantage that 
the old code will just hook on it.


3. Reflected via function .doc property, a Function.extractDocComment 
static method, or something even more mirror-like/stratified?




Yes, both are fine, .doc is great. Perhaps, even global binding 
help(...).


I'm not sure what is best, I lack experience programming in languages 
with doc-comment or triple-quoted equivalents (Python attached tests, 
e.g.). Comments (heh) welcome.


Thinking about 1, I would start with function-only.



Yes, this is the main case.

For 2 I'm inclined to say in body because it's too easy to lose the 
before context during the life of a function, compared to losing 
part of the body by accident.




At first glance there should be no issues with parsing in both cases. 
We sure have to restrict that only the 

Re: __doc__ for functions, classes, objects etc.

2011-08-30 Thread Rick Waldron
On Tue, Aug 30, 2011 at 3:39 AM, Dmitry A. Soshnikov 
dmitry.soshni...@gmail.com wrote:

 OK, let's up the topic. Seems there are no technical issues in the proposed
 thing -- we can simply either accept it or not. The question is whether it's
 needed and sound proposal and the feature to have in ECMAScript.

 Some summarized features below:

 + Ability to get help of any built-in and any user-defined function
 directly in runtime (in later case, authors should provide the
 documentations though)
 + Auto-suggest and hints of parameters and their types when typing function
 name in console.
 + Ability even to have sort of guards for types with issuing warnings in
 case if types mismatch (sort of recent contract.coffee projects and actually
 other langs, e.g. Haskell, Erlang, etc).
 - Code size will be increased to store the doc string. This can be optional
 in case of minimized scripts (lint tools can have option Remove
 doc-comments)

 As an example I show a spec description for `parseInt` function:

 15.1.2.2 parseInt (string , radix)

 Let [[Documentation]] property of the `parseInt` function be the following
 string:

 The parseInt function produces an integer value dictated by interpretation
 of the contents of the string argument according to the specified radix.
 Leading white space in string is ignored. If radix is undefined or 0, it is
 assumed to be 10 except when the number begins with the character pairs 0x
 or 0X, in which case a radix of 16 is assumed. If radix is 16, number may
 also optionally begin with the character pairs 0x or 0X.

 ...

 x.x.xx help(F)


A built-in, global object function property named help() will no doubt
conflict with userland code




 When the `help` function is called on the F object, the following steps are
 taken:

 1. If [[Class]] of the function is not Function throw TypeError
 2. Let doc be [[Documentation]] property of F
2.1 If doc is `undefined` return empty string
2.2. return String(doc)

 It's a simplified version of course (moreover, Allen wanted to eliminate
 [[Class]], so -- it's just an example).

 Do we need this?

 Dmitry.


 On 09.08.2011 23:59, Dmitry A. Soshnikov wrote:

 On 23.08.2011 20:54, Brendan Eich wrote:

 A convenient notation for multiline documentation comments, with
 convenient reflection (*not* via toString() scraping!), would be a fine
 thing.


 Yes, exactly this -- help(...) function, and also good auto-complete of
 object methods helped me some time ago formerly to learn Python very quickly
 just playing with it in console. By the way, ECMAScript (who will take
 responsibility to implement the ECMAScript -- ethanol implementation? :))
 also needs some installation binaries with the console. And yes -- with this
 great features for learning -- auto-complete of methods (the best thing to
 investigate objects just pressing `tab`) and help(...) function. I remember
 ES4 had/has the REPL, why not ES5? Of course we have all those consoles
 directly from the browsers (and also Node.js REPL), but it could be useful.
 Anyway, it's another topic, just relatively touches help(...) functions.

  Some of the design dimensions:

 0. Comment vs. string / quasiliteral?

 1. function-only, or object literal too -- or any declaration?


 I think functions are the main case, yes. Not sure about literals, since
 there are open issues such as, how to document a property (via descriptor
 field?)?

  2. Before function, a la javadoc comments, or first thing in body, a la
 the prologue directive idea?


 That's said, if before, then we should consider white-spaces and
 newlines after the comment and before the function header (though, as well
 as in the prologue). If before, then tones of old code written in javadoc
 will just work with the new engine. OTOH, this means that the exact syntax
 of javadocs will be standardized at the level of the spec (and it's a sound
 thing -- people will have to write exactly e.g. @property that the doc-er
 catch it correctly. OTOH again -- why not? -- to standardize common syntax
 of documenting functions). However, the spec may not parse the exact content
 of the comment but just save it as a string, regardless of what is written
 insides.

 A variant with inside is also good, underlines that the comment is sort
 of a function's property (I like yours simple doc name for that). Both
 variants are good, just outside has the advantage that the old code will
 just hook on it.

  3. Reflected via function .doc property, a Function.extractDocComment
 static method, or something even more mirror-like/stratified?


 Yes, both are fine, .doc is great. Perhaps, even global binding
 help(...).

  I'm not sure what is best, I lack experience programming in languages
 with doc-comment or triple-quoted equivalents (Python attached tests, e.g.).
 Comments (heh) welcome.

 Thinking about 1, I would start with function-only.


 Yes, this is the main case.

  For 2 I'm inclined to say in body because it's too easy to lose the
 

Re: __doc__ for functions, classes, objects etc.

2011-08-30 Thread Dean Landolt
On Tue, Aug 30, 2011 at 10:41 AM, Dmitry A. Soshnikov 
dmitry.soshni...@gmail.com wrote:

  On 30.08.2011 17:41, Rick Waldron wrote:

  On Tue, Aug 30, 2011 at 3:39 AM, Dmitry A. Soshnikov 
 dmitry.soshni...@gmail.com wrote:

 OK, let's up the topic. Seems there are no technical issues in the
 proposed thing -- we can simply either accept it or not. The question is
 whether it's needed and sound proposal and the feature to have in
 ECMAScript.

 Some summarized features below:

 + Ability to get help of any built-in and any user-defined function
 directly in runtime (in later case, authors should provide the
 documentations though)
 + Auto-suggest and hints of parameters and their types when typing
 function name in console.
 + Ability even to have sort of guards for types with issuing warnings in
 case if types mismatch (sort of recent contract.coffee projects and actually
 other langs, e.g. Haskell, Erlang, etc).
 - Code size will be increased to store the doc string. This can be
 optional in case of minimized scripts (lint tools can have option Remove
 doc-comments)

 As an example I show a spec description for `parseInt` function:

 15.1.2.2 parseInt (string , radix)

 Let [[Documentation]] property of the `parseInt` function be the following
 string:

 The parseInt function produces an integer value dictated by
 interpretation of the contents of the string argument according to the
 specified radix. Leading white space in string is ignored. If radix is
 undefined or 0, it is assumed to be 10 except when the number begins with
 the character pairs 0x or 0X, in which case a radix of 16 is assumed. If
 radix is 16, number may also optionally begin with the character pairs 0x or
 0X.

 ...

 x.x.xx help(F)


  A built-in, global object function property named help() will no doubt
 conflict with userland code



 It's derived question, we may choose any name which fits well (though, IMO
 `help` name isn't used much).



That's tough to say for sure, and even if true still probably isn't good
enough. Regardless, there's no excuse for this kind of global, especially in
light of a module system. Sure, specifically in a repl you'd probably want
to skip the require -- for this node offers up dot-prefixed repl keywords.
So something like .help(F) would be a lot safer and nearly as convenience as
a help global.

I think it would be useful for the committee to weigh in on the idea of repl
plugins. This particular design is pretty nice but it conflicts for
statements beginning with non-zero-prefixed decimals. In practice I don't
see this causing any real problems, but it'd be great if the grammer
explicitly forbid this, effectively reserving it for repl hooks.



 The main thing I want to clarify at this step, whether we need at all this
 thing in ES?

 Since committee keeps silence, I'd like to consider it better as Yes, we
 need it and there is nothing to add, rather than We don't need and don't
 want even to discuss (since there is no big sense in later, because the
 functionality seems useful). However, we need to clarify how *exactly* it's
 useful. Maybe using JS in console is so rare case and it isn't required
 much. OTOH, era of client-side-only-JS is behind and JS is also on server
 now. And from this viewpoint, in the console, it's the best to get the help,
 hints for parameters and even type checking for functions.



Brenden weighed in and laid out some of the design space. I suspect this
functionality can largely be pieced together with what harmony already gives
us. As Brenden hinted, quasis give us multiline strings. The __doc__ key is
just screaming to be a private name instead (generally true of all
wunderbars IMHO). This could be tacked onto functions and objects
imperatively, but it would be pretty goofy to put the doc string *after* its
function body. So for this to be serviceable we'd need a declarative way to
do this inside the function body. ISTR some syntax being thrown around to
set an own-prop on a function from inside its body but I can't recall
specifics -- is there anything harmonious for this?

Put the above three bits together with a de facto repl plugin syntax and
module mapping and you get a more sanitized (and extensible) version of
python's repl with the same developer ergonomics.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: __doc__ for functions, classes, objects etc.

2011-08-23 Thread Dmitry A. Soshnikov

So, is that's all? Anyone else thinks it's a needed thing in the ES?

On 22.08.2011 14:57, Dmitry A. Soshnikov wrote:

On 22.08.2011 12:47, Irakli Gozalishvili wrote:
I'm very much interested in getting something like this! In fact I 
have been useing similar documentation style for some time already:


function doc(lambda) {
  var doc = /\/\*([\s\S]*)?\*\//.exec(String(lambda))
  return doc ? doc[1].trim() : ''
}

function sum(a, b) {
  /* Calculates sum of given `a` and `b` arguments */
  return a + b;
}

doc(sum) \\  Calculates sum of given `a` and `b` arguments

Unfortunately this does not works on spidermonkey based js engines :(



Right. That's why I raised this issue, because the functionality is 
very powerful. Backing to my concrete example with redis, I just 
wanted to understand why the heck client.get('x'), after setting 
client.set('x', 10) returns for me `true`, but not 10. If I had this 
help(...) functionality I'd be able to get the description right from 
the console, saying that `.get` function should accept callback which 
already returns the value: client.get('x', function(err, data) {return 
data;}) - 10.


I of course could go to the documentation website (what actually I did 
after my fail tries :)), but I think it goes without saying that it 
would be the best if I could do this right from the console! Besides, 
this [[Documentation]] property can be used in hints (with showing 
parameters and their types) when typing function name.


From this viewpoint Python just wins and IMO we should have this 
feature in the ES.


Also I found that best way to support this on spidermonkey is via E4X 
hacks


function sum(a, b) {
docCalculates sum of given `a` and `b` arguments/doc
  return a + b
}

Unfortunately I don't have any solution working across all engines 
that would not require multiline string escaping:


function sum(a, b) {
  var doc = Calculates \
  sum of given\
  `a` and `b` argumnets

  return a + b
}




Yes, it's another pros to have [[Documentation]] standardized.


On Sunday, 2011-08-07 at 21:30 , Dmitry A. Soshnikov wrote:


On 21.08.2011 22:26, Peter van der Zee wrote:

On Sun, Aug 7, 2011 at 6:56 PM, Dmitry A. Soshnikov
dmitry.soshni...@gmail.com mailto:dmitry.soshni...@gmail.com wrote:

Hi,

What about to standardize (Python's) __doc__-umentation comments 
for JS?

What's the difference between that and the /** ... */ way of JSDoc?

/**
* This function does stuff
* @constructor
* @param {Object} foo
* @returns {Array}
*/
var f = function(){ ... };


It doesn't matter for me how *exactly* (syntactically) it will look
like. In this particular case the comment is outside a function's body
-- you then should consider and allow or not newlines after the
doc-comment, etc. Though, as well as in case of placing the comment
inside the body, but in this case I think we should mention that the
doc-comment is should be placed in the prologue.


What would a new language construct for this solve?


That's said, triple-strings by themselves (not only for doc-comments)
are very powerful construct to have and standardize. Did you work with
them in Python or CoffeeScript?

P.S.:

Another thing to notice. As was mentioned, it's good to have this
ability also for simple objects. From this viewpoint doc-string should
be set via property. But if I remember correctly, someone (all?) from
the committee didn't like Python's __names__ (despite the fact that JS
actually use them for __proto__, __noSuchMethod__, __count__,
__parent__, __iterator__ etc. -- non is standardized, stratified
meta-level won). But it would be great to have the ability to:

let foo = {
__doc__: My awesome object,
x: 100, y: 200
};

Object.help(foo); // My awesome object

or simply `help(foo)`.


I don't think we need special property for that, as anyone can just 
use `doc` or whatever they decide, bigger issue IMO is a property 
docs. How do you document `foo.x` if x is not a function or object ?


It was just an example. Mostly this doc is needed for functions. 
Though, we can think how we can do this for every property.


Dmitry.




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


Re: __doc__ for functions, classes, objects etc.

2011-08-23 Thread Brendan Eich
A convenient notation for multiline documentation comments, with convenient 
reflection (*not* via toString() scraping!), would be a fine thing.

Some of the design dimensions:

0. Comment vs. string / quasiliteral?

1. function-only, or object literal too -- or any declaration?

2. Before function, a la javadoc comments, or first thing in body, a la the 
prologue directive idea?

3. Reflected via function .doc property, a Function.extractDocComment static 
method, or something even more mirror-like/stratified?

I'm not sure what is best, I lack experience programming in languages with 
doc-comment or triple-quoted equivalents (Python attached tests, e.g.). 
Comments (heh) welcome.

Thinking about 1, I would start with function-only.

For 2 I'm inclined to say in body because it's too easy to lose the before 
context during the life of a function, compared to losing part of the body by 
accident.

Regarding 3, I bet Function.extractDocComment or a better name wins, especially 
if the whole solution allows monkey-patching a polyfill for downrev browsers 
that support source recovery (not SpiderMonkey's decompiler).

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


Re: __doc__ for functions, classes, objects etc.

2011-08-23 Thread Dmitry A. Soshnikov

On 23.08.2011 20:54, Brendan Eich wrote:

A convenient notation for multiline documentation comments, with convenient 
reflection (*not* via toString() scraping!), would be a fine thing.



Yes, exactly this -- help(...) function, and also good auto-complete of 
object methods helped me some time ago formerly to learn Python very 
quickly just playing with it in console. By the way, ECMAScript (who 
will take responsibility to implement the ECMAScript -- ethanol 
implementation? :)) also needs some installation binaries with the 
console. And yes -- with this great features for learning -- 
auto-complete of methods (the best thing to investigate objects just 
pressing `tab`) and help(...) function. I remember ES4 had/has the REPL, 
why not ES5? Of course we have all those consoles directly from the 
browsers (and also Node.js REPL), but it could be useful. Anyway, it's 
another topic, just relatively touches help(...) functions.



Some of the design dimensions:

0. Comment vs. string / quasiliteral?

1. function-only, or object literal too -- or any declaration?


I think functions are the main case, yes. Not sure about literals, since 
there are open issues such as, how to document a property (via 
descriptor field?)?



2. Before function, a la javadoc comments, or first thing in body, a la the 
prologue directive idea?


That's said, if before, then we should consider white-spaces and 
newlines after the comment and before the function header (though, as 
well as in the prologue). If before, then tones of old code written in 
javadoc will just work with the new engine. OTOH, this means that the 
exact syntax of javadocs will be standardized at the level of the spec 
(and it's a sound thing -- people will have to write exactly e.g. 
@property that the doc-er catch it correctly. OTOH again -- why not? 
-- to standardize common syntax of documenting functions). However, the 
spec may not parse the exact content of the comment but just save it as 
a string, regardless of what is written insides.


A variant with inside is also good, underlines that the comment is 
sort of a function's property (I like yours simple doc name for 
that). Both variants are good, just outside has the advantage that the 
old code will just hook on it.



3. Reflected via function .doc property, a Function.extractDocComment static 
method, or something even more mirror-like/stratified?



Yes, both are fine, .doc is great. Perhaps, even global binding help(...).


I'm not sure what is best, I lack experience programming in languages with 
doc-comment or triple-quoted equivalents (Python attached tests, e.g.). 
Comments (heh) welcome.

Thinking about 1, I would start with function-only.



Yes, this is the main case.


For 2 I'm inclined to say in body because it's too easy to lose the before 
context during the life of a function, compared to losing part of the body by accident.



At first glance there should be no issues with parsing in both cases. We 
sure have to restrict that only the first multiline comment from _above_ 
of a function is treated as doc-comment. It will not touch any other 
upper-comments


// this one isn't caught

/*
and this one also
*/

/**
 * but this is OK
 */
function foo() {}

console.log(foo.doc); // but this is OK

With the prologue -- there also directives' places should be considered. 
I think the best place for them is under the doc-comment.


function foo() {

   My function 

  use strict;
}


Regarding 3, I bet Function.extractDocComment or a better name wins, especially 
if the whole solution allows monkey-patching a polyfill for downrev browsers 
that support source recovery (not SpiderMonkey's decompiler).



Yes, maybe.

Dmitry.

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


Re: __doc__ for functions, classes, objects etc.

2011-08-23 Thread Bill Frantz

On 8/23/11 at 9:54, bren...@mozilla.com (Brendan Eich) wrote:


2. Before function, a la javadoc comments, or first thing in body, a la the 
prologue directive idea?


I have found it difficult to read a Java program from top to 
bottom because the javadoc comments proceed the function/method 
header. I want to see what the compiler reads first and then 
read the human commentary about what it means. With the way Java 
is set up, I have to jump around in the source instead of 
reading from top to bottom.


Cheers - Bill

---
Bill Frantz| Snow shuts down federal  | Periwinkle
(408)356-8506  | government, life goes on.| 16345 
Englewood Ave
www.pwpconsult.com |  - Associated press 2/9/2010 | Los Gatos, 
CA 95032


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


Re: __doc__ for functions, classes, objects etc.

2011-08-22 Thread Dmitry A. Soshnikov

On 22.08.2011 12:47, Irakli Gozalishvili wrote:
I'm very much interested in getting something like this! In fact I 
have been useing similar documentation style for some time already:


function doc(lambda) {
  var doc = /\/\*([\s\S]*)?\*\//.exec(String(lambda))
  return doc ? doc[1].trim() : ''
}

function sum(a, b) {
  /* Calculates sum of given `a` and `b` arguments */
  return a + b;
}

doc(sum) \\  Calculates sum of given `a` and `b` arguments

Unfortunately this does not works on spidermonkey based js engines :(



Right. That's why I raised this issue, because the functionality is very 
powerful. Backing to my concrete example with redis, I just wanted to 
understand why the heck client.get('x'), after setting client.set('x', 
10) returns for me `true`, but not 10. If I had this help(...) 
functionality I'd be able to get the description right from the console, 
saying that `.get` function should accept callback which already returns 
the value: client.get('x', function(err, data) {return data;}) - 10.


I of course could go to the documentation website (what actually I did 
after my fail tries :)), but I think it goes without saying that it 
would be the best if I could do this right from the console! Besides, 
this [[Documentation]] property can be used in hints (with showing 
parameters and their types) when typing function name.


From this viewpoint Python just wins and IMO we should have this 
feature in the ES.


Also I found that best way to support this on spidermonkey is via E4X 
hacks


function sum(a, b) {
docCalculates sum of given `a` and `b` arguments/doc
  return a + b
}

Unfortunately I don't have any solution working across all engines 
that would not require multiline string escaping:


function sum(a, b) {
  var doc = Calculates \
  sum of given\
  `a` and `b` argumnets

  return a + b
}




Yes, it's another pros to have [[Documentation]] standardized.


On Sunday, 2011-08-07 at 21:30 , Dmitry A. Soshnikov wrote:


On 21.08.2011 22:26, Peter van der Zee wrote:

On Sun, Aug 7, 2011 at 6:56 PM, Dmitry A. Soshnikov
dmitry.soshni...@gmail.com mailto:dmitry.soshni...@gmail.com wrote:

Hi,

What about to standardize (Python's) __doc__-umentation comments 
for JS?

What's the difference between that and the /** ... */ way of JSDoc?

/**
* This function does stuff
* @constructor
* @param {Object} foo
* @returns {Array}
*/
var f = function(){ ... };


It doesn't matter for me how *exactly* (syntactically) it will look
like. In this particular case the comment is outside a function's body
-- you then should consider and allow or not newlines after the
doc-comment, etc. Though, as well as in case of placing the comment
inside the body, but in this case I think we should mention that the
doc-comment is should be placed in the prologue.


What would a new language construct for this solve?


That's said, triple-strings by themselves (not only for doc-comments)
are very powerful construct to have and standardize. Did you work with
them in Python or CoffeeScript?

P.S.:

Another thing to notice. As was mentioned, it's good to have this
ability also for simple objects. From this viewpoint doc-string should
be set via property. But if I remember correctly, someone (all?) from
the committee didn't like Python's __names__ (despite the fact that JS
actually use them for __proto__, __noSuchMethod__, __count__,
__parent__, __iterator__ etc. -- non is standardized, stratified
meta-level won). But it would be great to have the ability to:

let foo = {
__doc__: My awesome object,
x: 100, y: 200
};

Object.help(foo); // My awesome object

or simply `help(foo)`.


I don't think we need special property for that, as anyone can just 
use `doc` or whatever they decide, bigger issue IMO is a property 
docs. How do you document `foo.x` if x is not a function or object ?


It was just an example. Mostly this doc is needed for functions. Though, 
we can think how we can do this for every property.


Dmitry.


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


__doc__ for functions, classes, objects etc.

2011-08-21 Thread Dmitry A. Soshnikov

Hi,

What about to standardize (Python's) __doc__-umentation comments for 
JS? Not exactly in this name with underscores, but the idea itself. I 
remember recent discussion on Twitter where Brendan proposed to use a 
prologue string for that:


function foo() {
  this is the super function
}

then having some util which can analyze string decompilation of the 
function shows the documentation: Object.getDocumentation(foo) - this 
is the super function.


However, engines usually optimize this case and remove dead-code. 
Moreover, `toString` for functions is not standardized also. So all 
these are just toys and examples. In contrast -- Python's __doc__ make 
this documentation as a property of function. It can be some internal 
property -- no matter, for that Object.getDoc(fn) will read this 
[[Documentation]] stuff.


Why did I recall it? -- a real practical case -- just installed redis 
k-w database to play and wanted to see the documentation right from the 
node's console -- but... can't. There's no such an ability in JavaScript 
-- which is the best in Python.


So if to accept triple-string and comments we catch two things at once 
(after all, triple-strings are useful by themselves):


function foo() {
  
  Still the stuff is super.
  @author Me
  And double quotes are not needed to escape,
  as well as 'single'
  

  // implementation

}

Object.getDoc(foo) - Still the stuff is super.\n@author MeAnd double 
\quotes\ are not needed to escape,\nas well as 'single'


Huh?

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


Re: __doc__ for functions, classes, objects etc.

2011-08-21 Thread Rick Waldron
This is a great idea, but I wonder if the concept could be implemented using
comments as we already know them? This would leave it up to the user how
they want to parse the property's value. Just a thought - either way, I
think this is a valuable idea.

Rick



On Sun, Aug 7, 2011 at 12:56 PM, Dmitry A. Soshnikov 
dmitry.soshni...@gmail.com wrote:

 Hi,

 What about to standardize (Python's) __doc__-umentation comments for JS?
 Not exactly in this name with underscores, but the idea itself. I remember
 recent discussion on Twitter where Brendan proposed to use a prologue string
 for that:

 function foo() {
  this is the super function
 }

 then having some util which can analyze string decompilation of the
 function shows the documentation: Object.getDocumentation(foo) - this is
 the super function.

 However, engines usually optimize this case and remove dead-code.
 Moreover, `toString` for functions is not standardized also. So all these
 are just toys and examples. In contrast -- Python's __doc__ make this
 documentation as a property of function. It can be some internal property --
 no matter, for that Object.getDoc(fn) will read this [[Documentation]]
 stuff.

 Why did I recall it? -- a real practical case -- just installed redis k-w
 database to play and wanted to see the documentation right from the node's
 console -- but... can't. There's no such an ability in JavaScript -- which
 is the best in Python.

 So if to accept triple-string and comments we catch two things at once
 (after all, triple-strings are useful by themselves):

 function foo() {
  
  Still the stuff is super.
  @author Me
  And double quotes are not needed to escape,
  as well as 'single'
  

  // implementation

 }

 Object.getDoc(foo) - Still the stuff is super.\n@author MeAnd double
 \quotes\ are not needed to escape,\nas well as 'single'

 Huh?

 Dmitry.
 __**_
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/**listinfo/es-discusshttps://mail.mozilla.org/listinfo/es-discuss

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


Re: __doc__ for functions, classes, objects etc.

2011-08-21 Thread Peter van der Zee
On Sun, Aug 7, 2011 at 6:56 PM, Dmitry A. Soshnikov
dmitry.soshni...@gmail.com wrote:
 Hi,

 What about to standardize (Python's) __doc__-umentation comments for JS?

What's the difference between that and the /** ... */ way of JSDoc?

/**
 * This function does stuff
 * @constructor
 * @param {Object} foo
 * @returns {Array}
 */
var f = function(){ ... };

What would a new language construct for this solve?

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


Re: __doc__ for functions, classes, objects etc.

2011-08-21 Thread Dmitry A. Soshnikov

On 21.08.2011 22:26, Peter van der Zee wrote:

On Sun, Aug 7, 2011 at 6:56 PM, Dmitry A. Soshnikov
dmitry.soshni...@gmail.com  wrote:

Hi,

What about to standardize (Python's) __doc__-umentation comments for JS?

What's the difference between that and the /** ... */ way of JSDoc?

/**
  * This function does stuff
  * @constructor
  * @param {Object} foo
  * @returns {Array}
  */
var f = function(){ ... };



It doesn't matter for me how *exactly* (syntactically) it will look 
like. In this particular case the comment is outside a function's body 
-- you then should consider and allow or not newlines after the 
doc-comment, etc. Though, as well as in case of placing the comment 
inside the body, but in this case I think we should mention that the 
doc-comment is should be placed in the prologue.



What would a new language construct for this solve?



That's said, triple-strings by themselves (not only for doc-comments) 
are very powerful construct to have and standardize. Did you work with 
them in Python or CoffeeScript?


P.S.:

Another thing to notice. As was mentioned, it's good to have this 
ability also for simple objects. From this viewpoint doc-string should 
be set via property. But if I remember correctly, someone (all?) from 
the committee didn't like Python's __names__ (despite the fact that JS 
actually use them for __proto__, __noSuchMethod__, __count__, 
__parent__, __iterator__ etc. -- non is standardized, stratified 
meta-level won). But it would be great to have the ability to:


let foo = {
  __doc__: My awesome object,
  x: 100, y: 200
};

Object.help(foo); // My awesome object

or simply `help(foo)`.

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