[plt-scheme] Algebraic patterns

From: Paul Graunke (ptg at ccs.neu.edu)
Date: Tue Oct 1 14:29:33 EDT 2002

I would have expected something like
 (define `(x y) (list 1 2))
or
 (define `(,x ,y) (list 1 2))

Also,
 (define (x y) (list 1 2)) 
would be the same as
 (define x (lambda (y) (list 1 2)))

It's a bit more clunky, but quote is the usual way to distinguish
between using ()'s for application or lists.  Maybe a different default is
needed?

Paul
 

At Tue, 1 Oct 2002 13:47:13 -0400, Eli Barzilay wrote:
>   For list-related administrative tasks:
>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> 
> On Oct  1, Robert Bruce Findler wrote:
> > Wow, this looks great!
> 
> Thanks!  I do think it's much better than some eopl-like cases thing
> to destruct things.  If I were teaching, I would definitely use this
> approach...  (Oh, one more missing thing to make it actually be
> pattern matching, is to be able to try matches instead of just getting
> an error...)
> 
> 
> > One thought: most of those forms add syntax to places that were illegal
> > already; eg (let ([(list x y) (list 1 2)]) x) was illegal before and so
> > it seems good to change it in that way. The one that doesn't do that is
> > define. In your world, this:
> > 
> >   (define (id x) x)
> > 
> > would probably be an error instead of defining the identity function.
> > So, I wonder if it would be better to only stick with adding meaning to
> > things that were illegal before and support patterns like this:
> > 
> >   (define (id--on-pairs (cons x y)) (cons x y))
> > 
> > but not patterns like this:
> > 
> >   (define (cons hd tl) (cons 1 2))
> > 
> > You might have with a new define-pattern form for the above, tho.
> 
> Well, first of all, define would work as usual for everything except
> defined patterns, so `(define (id x) x)' works as long as `id' is not
> defined as a pattern.  For those cases, you can just use `define' with
> an explicit lambda which will always work.  I thought about making
> those pattern identifiers different which is bad because it doesn't
> look like the constructor any more.  I thought about your solution too
> but if you go that way, then you could also do the implicit lists and
> vector thing from match.ss.
> 
> 
> > One other thought: you could also add support for curried function
> > patterns:
> > 
> >   (define ((adder x) y) (+ x y))
> >   (define add3 (adder 3))
> 
> Heh, of course -- it'll probably take me some time, but at some point
> I will add this thing to Swindle, where I already made the above
> possible.  I even went further and allowed this:
> 
>   => (let* ((((adder x) y) (+ x y)) (add3 (adder 3))) (add3 4))
>   7
> 
> -- 
>           ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
>                   http://www.barzilay.org/                 Maze is Life!



Posted on the users mailing list.