[plt-scheme] Re: Wrote some notes on using PLT Scheme for TAPL stuff

From: Corey Sweeney (corey.sweeney at gmail.com)
Date: Sun Jan 8 12:53:13 EST 2006

That woulda been cool when I was going though that book.  When you finish
you might want to try to get a link from Pierce's web site, and/or inclusion
in his download directory for the book, as that's probably most likely place
I would have seen it.

Corey


On 1/5/06, David Van Horn <dvanhorn at cs.brandeis.edu> wrote:
>
> Danny Yoo wrote:
> > I've been reading Pierce's excellent "Types and Programming Languages"
> > textbook, and thought it might be fun to try to use PLT Scheme instead
> of
> > OCaml.
>
> It is fun---I've done this sort of thing over and over and over again.
>
> >     http://hkn.eecs.berkeley.edu/~dyoo/tmp/tapl-plt.txt
>
> Just a couple comments on the code:
>
> > (**********************************)
> > let rec isval t = match t with
> >     TmTrue -> true
> >   | TmFalse -> true
> >   | t when isnumericalval t -> true
> >   | _ -> false
> > (**********************************)
> >
> >
> > Here's our equivalent in PLT Scheme:
> >
> > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> > (define (isval t)
> >   (match t
> >     ((struct True ()) #t)
> >     ((struct False ()) #t)
> >     (t (=> fail) (if (isnumericalval t) #t (fail)))
> >     (else #f)))
> > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> >
> > It's slightly uglier than in OCaml --- the third clause uses the
> > enhanced "=>" form to make sure pattern matching can continue when
> > isnumericalval fails --- but still, it isn't bad.  (And of course we
> > could easily simplify the function so it doesn't need it, but it's
> > good to know about "=>", since eval1 uses the "when" form quite a
> > bit.)
>
> You might use the `?' pattern in plt-match.ss to correspond to `when'
> guards in OCaml.  Eg:
>
> (define (isval t)
>    (match t
>      ((struct True ()) #t)
>      ((struct False ()) #t)
>      ((? isnumericalval) #t)
>      (else #f)))
>
> Another thing to note is that in OCaml, isval is of type t -> bool, but
> your Scheme predicates are Any -> bool, which isn't bad in itself, but
> if you're applying isval to non-terms, chances are it's a bug.  I use
> contracts to catch those things.
>
> As for concrete syntax, I almost never write parsers when I'm
> experimenting with languages implemented in Scheme.  I just cook up an
> S-expression concrete syntax and write functions parse : S-expr -> t and
> unparse : t -> S-expr.  (Of course, learning the parser tools is a fine
> thing.)  There are examples of this in the pattern matcher documentation
> if I recall correctly.
>
> David
>
> _________________________________________________
>   For list-related administrative tasks:
>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>



--
((lambda (y) (y y)) (lambda (y) (y y)))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20060108/455a5add/attachment.html>

Posted on the users mailing list.