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