# [plt-scheme] matching/dispatching a la Erlang

On Thu, 28 Aug 2003, David Van Horn wrote:
>* For list-related administrative tasks:
*>* http://list.cs.brown.edu/mailman/listinfo/plt-scheme
*>*
*>* William Sprague wrote:
*>* > I want to be able to do something like the following, where
*>* > "case-on-steroids" is my desired operator:
*>* >
*>* > (define (choose input)
*>* > (case-on-steroids (X Y) ; define X and Y as free variables
*>* > ((X X Y) (+ X Y)) ; matches (input 1 1 2), bind X->1, Y->2
*>* > ((1 X (2 Y) X) (* X Y)) ; matches (input 1 100 '(2 300) 100)
*>* > ; X->100, Y->300
*>* > (_ 'whatever)))) ; matches anything no bindings
*
This style of matching is now available in the latest release of the
match.ss library.
-Bruce
>*
*>* I believe you want Bigloo-style pattern matching. I can't remember if there's
*>* a PLT package that provides such matching, but in Bigloo it would look like:
*>*
*>* (define (choose input)
*>* (match-case input
*>* (((kwote input) ?x ?x ?y) (+ x y))
*>* (((kwote input) 1 ?x (2 ?y) ?x) (* x y))
*>* (?- 'whatever)))
*>*
*>* (choose '(input 1 1 2)) ;=> 3
*>* (choose '(input 1 100 (2 300) 100)) ;=> 3000
*>*
*>* You could write it equivalently in PLT as:
*>*
*>* (require (lib "match.ss"))
*>* (define choose
*>* (match-lambda
*>* [('input x-1 x-2 y)
*>* (=> fail)
*>* (if (eq? x-1 x-2)
*>* (+ x-1 y)
*>* (fail))]
*>* [('input 1 x-1 (2 y) x-2)
*>* (=> fail)
*>* (if (eq? x-1 x-2)
*>* (* x-1 y)
*>* (fail))]
*>* [_ 'whatever]))
*>*
*>* HTH
*>*
*>* -d
*>*
*>*
*>*
*