This is just a last-minute plea, given that the proposal freeze is
apparently imminent: could the committee please reserve a slot
for solving the "readable monadic coding in Javascript" issue -
it needs no semantic changes, only syntax, and combining
technical aspects of existing proposal might be sufficient, but
none of the existing proposals alone seems sufficient to address
this problem (nor is that that aim of the existing proposals):
- monadic programming is a modular variant of cps-style code,
which allows to define purpose-build control structures from
the ground up, starting with composing two statements/blocks
together while binding variables in the second to results from
the first;
since the committee is already familiar with the ideas of object
and value proxies, it might help to think of monads and their
relatives as control structure proxies; they allow to define
variants of control structures that are or would need to be
built-in to Javascript (not just loops and conditionals, but
break/continue/exceptions/backtracking search/..) while
providing a uniform look and feel for control structures
adapted to different problem domains (be it asynchronous
code, parsers, constraint programming, workflows, ..);
it is technically possible to use monadic programming in
Javascript, so no semantic extensions are necessary, but when
the nested callbacks (one per line of proxied code) that are
typical for this style are translated to Javascript syntax, the
results are cumbersome enough to nullify any readability
advantages - the essence of code is buried in syntactic noise;
this issue is well-known, has been blogged about in several
application contexts (not limited to asynchronous code), and
has even attracted implementations of a large variety of libraries
and pre-processors; in this, the situation is similar to module
loaders, both in the unhelpful (for reuse) divergence of styles
and in the fact that libraries alone cannot solve the issue;
the idea would be to reduce the need for pre-processing,
giving library-based approaches a better chance; preferably,
by making the syntax for function definitions and calls simple
enough to keep nested callback chains readable; if that
doesn't work out, special monad notation could be considered;
Relation to existing proposals/previous discussion:
- block lambdas, though they allow to make single callbacks
to higher-order functions look like language structures,
thereby supporting the re-definition of some complex
control structures, do not help with user-defined control
structures built from smaller building blocks (variable
binding, statement composition) - they do not reduce
the amount of brace nesting for nested callback chains,
although they do aim to reduce the parenthesis nesting
of function calls;
- arrow functions, especially the implicit expression return
part, would be a step towards simpler function and callback
definitions, but that does not quite suffice, function calls
also need to be simplified (nested callback chains consist
of alternating function definitions and function calls);
- if block_lambdas make it into ES/next, it would be possible
to rescue the simple part of arrow functions (expression
return) - since block_lambdas include blocks as expressions,
with unambiguous new syntax, the block bodies of the
arrow syntax proposal could be dropped, leaving a
lightweight syntax proposal;
The block lambda proposal includes paren-free calls, while
the arrow function proposal includes paren-free definitions.
Whichever of the two proposals wins, if the combination of
paren-free calls and paren-free definitions, for the subcase
of expression-returning functions, can make it into ES/next,
the situation for monadic programming patterns would be
improved significantly.
Before arrow functions and block lambdas, I tried to outline
the problems of nested parentheses and braces that result
from nested callbacks, with some suggestions toward a
solution (moving parens and braces outward, where they
may become optional in the usage contexts typical for nested
callback chains - similar to what happens in arrow syntax, but
also for function calls) - see my 8th of April message in the
thread "Flattening syntactic tail nests (paren-free, continued)".
Those suggestions are more awkward than I'd like, the '@'
symbol is apparently wanted elsewhere, and the syntax would
need to be worked out in the context of ES grammar. But
either those suggestions or the combination of the syntax
aspects of block lambdas and arrow functions could serve
as a placeholder for a proper solution, in view of the deadline.
The placeholder would be separate from the specific proposals
of block lambdas and arrow functions, and could be accepted
with a tentative status, subject to it being clarified by the time
the other proposals settle down.
If there turns out to be no way to solve the issue, which is
Function definition and call syntax that enables
readable coding of monadic programming patterns
satisfactorily in JS, by the time the finished proposals get
integrated in the new spec, the placeholder proposal could
be dropped and forwarded to ES/next/next, but if a solution
can be worked out in time, based on existing material, it
would be sad if it foundered on the proposal deadline.
Claus
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss