[plt-scheme] Re: Wrote some notes on using PLT Scheme for TAPL stuff
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