

Clojure Pattern Matching Lib: literal, seq, map and other patterns - gtani
http://groups.google.com/group/clojure/browse_thread/thread/8aa213ce127c5aca

======
swannodette
One of the main developers here. Couple of points that aren't mentioned in the
thread or aren't obvious w/o reading the whole thing:

* This is yet another example of how powerful macros are. All the features described are implemented in ~700 lines of code and a single macro.

* The pattern matching library is meant to be user extensible - you'll be able add your own patterns / syntax. Users simply need to bring their data types to whatever protocol is required by your new pattern. I think this going to be crazy powerful. For example - very fast pattern matching on primitive arrays / buffers.

* This is the groundwork for bringing high performance predicate dispatch to Clojure. This is under explored territory for dynamic languages.

~~~
exDM69
* This is the groundwork for bringing high performance predicate dispatch to Clojure. This is under explored territory for dynamic languages.

I really like the way how pattern matching (in Haskell, etc) is transformed
into a bunch of case expressions, which can then be compiled into code where
each argument is evaluated only once and each "then" expression is compiled
only once (no duplicates).

However, to my best knowledge, it requires some static type information to
make the compiling transformation possible. E.g. the Haskell compiler knows
that a Maybe Bool can have only three possible values: Just True, Just False
or Nothing.

How do you do this in Clojure with dynamic typing? This really intrigues me
and you're really pushing the boundaries of dynamic languages and compiling
here a little bit. Very interesting indeed!

* For the uninitiated: you can find good description of compiling pattern matching in Simon Peyton Jones's book here: [http://research.microsoft.com/en-us/um/people/simonpj/papers...](http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/)

~~~
swannodette
This library will produce a decision tree where each argument is only tested
once - no backtracking. How is a bit too much to explain here. I recommend the
Maranget paper Compiling Pattern Matching to Good Decision Trees on which this
work is based.

------
kennystone
Awesome, one of the things I was really missing coming from Erlang.

------
takeoutweight
I saw guards mentions in the "notes" but no evidence in the TODO. Does guarded
pattern matching work with your compilation strategy?

~~~
swannodette
I have some rough thoughts on how to implement guards, nothing concrete, but I
don't see any obstacles to integration with our compilation strategy.

