On Wed Jul 4 08:01:43 PDT 2012 Brendan Eich brendan at mozilla.org
wrote:
> If only JS had pattern matching!
[...]

On Mon Jul 9 09:19:54 PDT 2012 Russell Leggett russell.leggett at gmail.com 
wrote:
> I know that full blown patterns are out of scope (though I'm hoping maybe
> this discussion might change that), but even if we can't have it now, I
> think irrefutable destructuring would really make people see the potential.

Actually, pattern matching *can* be implemented in the current JS language, as 
a very simple library [1] of 150 lines of JS (plus more 150 lines of 
optimizations).
The library can be tested online in any browser with no extra installation, at 
the following address [2]:
http://mypatterns.free.fr/js/stable/mypatterns/notations.html
The implementation and the matching concepts are completely described in a
recent paper [3].

Of course, this library-based implementation is inferior to the kind of 
language 
support being discussed for Harmony, as it implies some notational overheads.
For instance, when in Harmony (as currently foreseen) you would write:

 let [x...l] = [1,2,3];

to bind x=1 and l=[2,3], using the library you would have to call 
a "match" function like this:

 let s = match([1,2,3], "[%x|%l]");

which binds s={x:1,l:[2,3]}. 
(As you may see, in the current implementation, "|" is used instead 
of "..." and variables in the pattern are prefixed by "%", but these 
can be changed easily - the notation language can in fact be customized 
arbitrarily.)

Thus, the notational overheads (apart the above accidental diffs) are:
- putting quotes around the pattern to make it a string, 
- explicitly calling the match function and storing its results in s, and
- getting x and l rather as s.x and s.l

Nevertheless, I think that this (modest) prototype could serve discussions about
future patterns in JS in the following ways:

1. by offering a playground for different pattern dialects in today's JS, 
which can be better than discussing them only on paper examples, until fully 
implemented in the language. Indeed, by studying the straightforward 
implementation [1],
one can see that every notation (e.g. the arrays notation) can be changed by 
simply
modifying one single function (Array.prototype.matches() in this case).

2. by introducing (in [3]) a simple conceptual framework in which the meaning 
of a pattern can be cleanly defined. Moreover, this meaning applies to all of: 
destructuring patterns, binding patterns and refutable patterns. This is a bit 
similar
to the (elegant!) factorized definition of refutable and irrefutable patterns 
in 
the strawman:pattern_matching, but additionnally separates the definitions of
array patterns, object patterns, and patterns for different kinds of literals,
instead of defining the meaning of all of them in a single recursive function.

I am of course available for further details for anyone finding this topics 
useful.

Regards,
Nic.

[1] The custom notations library:
    http://mypatterns.free.fr/js/stable/mypatterns/notations.js
[2] Try customized notations in JavaScript online:
    http://mypatterns.free.fr/js/stable/mypatterns/notations.html
[3] Pattern Matching for the Masses using Custom Notations.
    Science of Computer Programming 77:5 (2012) 609–635.
    http://nic.volanschi.free.fr/papers/notations-scp12.pdf


_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to