497 lines
21 KiB
HTML
497 lines
21 KiB
HTML
|
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
|
<html>
|
||
|
<!--
|
||
|
|
||
|
Generated from r6rs.tex by tex2page, v 20100828
|
||
|
(running on MzScheme 4.2.4, :unix),
|
||
|
(c) Dorai Sitaram,
|
||
|
http://evalwhen.com/tex2page/index.html
|
||
|
|
||
|
-->
|
||
|
<head>
|
||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
|
<title>
|
||
|
Revised^6 Report on the Algorithmic Language Scheme
|
||
|
</title>
|
||
|
<link rel="stylesheet" type="text/css" href="r6rs-Z-S.css" title=default>
|
||
|
<meta name=robots content="index,follow">
|
||
|
</head>
|
||
|
<body>
|
||
|
<div id=slidecontent>
|
||
|
<div align=right class=navigation>[Go to <span><a href="r6rs.html">first</a>, <a href="r6rs-Z-H-15.html">previous</a></span><span>, <a href="r6rs-Z-H-17.html">next</a></span> page<span>; </span><span><a href="r6rs-Z-H-2.html#node_toc_start">contents</a></span><span><span>; </span><a href="r6rs-Z-H-21.html#node_index_start">index</a></span>]</div>
|
||
|
<p></p>
|
||
|
<a name="node_chap_B"></a>
|
||
|
<h1 class=chapter>
|
||
|
<div class=chapterheading><a href="r6rs-Z-H-2.html#node_toc_node_chap_B">Appendix B</a></div><br>
|
||
|
<a href="r6rs-Z-H-2.html#node_toc_node_chap_B">Sample definitions for derived forms</a></h1>
|
||
|
<p></p>
|
||
|
<p>
|
||
|
This appendix contains sample definitions for some of the keywords
|
||
|
described in this report in terms of simpler forms:</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<a name="node_sec_Temp_36"></a>
|
||
|
<h4 class=section><a href="r6rs-Z-H-2.html#node_toc_node_sec_Temp_36"><tt>cond</tt></a></h4>
|
||
|
<p>The <tt>cond</tt> keyword (section <a href="r6rs-Z-H-14.html#node_sec_11.4.5">11.4.5</a>)
|
||
|
could be defined in terms of <tt>if</tt>, <tt>let</tt> and <tt>begin</tt> using <tt>syntax-rules</tt> as follows:</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
|
||
|
<tt>(define-syntax <tt>cond</tt>
|
||
|
<p class=nopadding> (syntax-rules (else =>)</p>
|
||
|
|
||
|
<p class=nopadding> ((cond (else result1 result2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> (begin result1 result2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> ((cond (test => result))</p>
|
||
|
|
||
|
<p class=nopadding> (let ((temp test))</p>
|
||
|
|
||
|
<p class=nopadding> (if temp (result temp))))</p>
|
||
|
|
||
|
<p class=nopadding> ((cond (test => result) clause1 clause2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let ((temp test))</p>
|
||
|
|
||
|
<p class=nopadding> (if temp</p>
|
||
|
|
||
|
<p class=nopadding> (result temp)</p>
|
||
|
|
||
|
<p class=nopadding> (cond clause1 clause2 ...))))</p>
|
||
|
|
||
|
<p class=nopadding> ((cond (test)) test)</p>
|
||
|
|
||
|
<p class=nopadding> ((cond (test) clause1 clause2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let ((temp test))</p>
|
||
|
|
||
|
<p class=nopadding> (if temp</p>
|
||
|
|
||
|
<p class=nopadding> temp</p>
|
||
|
|
||
|
<p class=nopadding> (cond clause1 clause2 ...))))</p>
|
||
|
|
||
|
<p class=nopadding> ((cond (test result1 result2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> (if test (begin result1 result2 ...)))</p>
|
||
|
|
||
|
<p class=nopadding> ((cond (test result1 result2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> clause1 clause2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (if test</p>
|
||
|
|
||
|
<p class=nopadding> (begin result1 result2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (cond clause1 clause2 ...)))))</p>
|
||
|
<p></tt>
|
||
|
</p>
|
||
|
<a name="node_sec_Temp_37"></a>
|
||
|
<h4 class=section><a href="r6rs-Z-H-2.html#node_toc_node_sec_Temp_37"><tt>case</tt></a></h4>
|
||
|
<p>The <tt>case</tt> keyword (section <a href="r6rs-Z-H-14.html#node_sec_11.4.5">11.4.5</a>) could be defined in terms of <tt>let</tt>, <tt>cond</tt>, and
|
||
|
<tt>memv</tt> (see library chapter on “List utilities”) using <tt>syntax-rules</tt> as follows:</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
|
||
|
<tt>(define-syntax <tt>case</tt>
|
||
|
<p class=nopadding> (syntax-rules (else)</p>
|
||
|
|
||
|
<p class=nopadding> ((case expr0</p>
|
||
|
|
||
|
<p class=nopadding> ((key ...) res1 res2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> ...</p>
|
||
|
|
||
|
<p class=nopadding> (else else-res1 else-res2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> (let ((tmp expr0))</p>
|
||
|
|
||
|
<p class=nopadding> (cond</p>
|
||
|
|
||
|
<p class=nopadding> ((memv tmp '(key ...)) res1 res2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> ...</p>
|
||
|
|
||
|
<p class=nopadding> (else else-res1 else-res2 ...))))</p>
|
||
|
|
||
|
<p class=nopadding> ((case expr0</p>
|
||
|
|
||
|
<p class=nopadding> ((keya ...) res1a res2a ...)</p>
|
||
|
|
||
|
<p class=nopadding> ((keyb ...) res1b res2b ...)</p>
|
||
|
|
||
|
<p class=nopadding> ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let ((tmp expr0))</p>
|
||
|
|
||
|
<p class=nopadding> (cond</p>
|
||
|
|
||
|
<p class=nopadding> ((memv tmp '(keya ...)) res1a res2a ...)</p>
|
||
|
|
||
|
<p class=nopadding> ((memv tmp '(keyb ...)) res1b res2b ...)</p>
|
||
|
|
||
|
<p class=nopadding> ...)))))</p>
|
||
|
<p></tt></p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<a name="node_sec_Temp_38"></a>
|
||
|
<h4 class=section><a href="r6rs-Z-H-2.html#node_toc_node_sec_Temp_38"><tt>let*</tt></a></h4>
|
||
|
<p>The <tt>let*</tt> keyword (section <a href="r6rs-Z-H-14.html#node_sec_11.4.6">11.4.6</a>)
|
||
|
could be defined in terms of <tt>let</tt>
|
||
|
using <tt>syntax-rules</tt> as follows:</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
|
||
|
<tt>(define-syntax <tt>let*</tt>
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((let* () body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let () body1 body2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> ((let* ((name1 expr1) (name2 expr2) ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let ((name1 expr1))</p>
|
||
|
|
||
|
<p class=nopadding> (let* ((name2 expr2) ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)))))</p>
|
||
|
<p></tt></p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<a name="node_sec_Temp_39"></a>
|
||
|
<h4 class=section><a href="r6rs-Z-H-2.html#node_toc_node_sec_Temp_39"><tt>letrec</tt></a></h4>
|
||
|
<p>The <tt>letrec</tt> keyword (section <a href="r6rs-Z-H-14.html#node_sec_11.4.6">11.4.6</a>)
|
||
|
could be defined approximately in terms of <tt>let</tt>
|
||
|
and <tt>set!</tt> using <tt>syntax-rules</tt>, using a helper
|
||
|
to generate the temporary variables
|
||
|
needed to hold the values before the assignments are made,
|
||
|
as follows:</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
|
||
|
<tt>(define-syntax <tt>letrec</tt>
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((letrec () body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let () body1 body2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> ((letrec ((var init) ...) body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (letrec-helper</p>
|
||
|
|
||
|
<p class=nopadding> (var ...)</p>
|
||
|
|
||
|
<p class=nopadding> ()</p>
|
||
|
|
||
|
<p class=nopadding> ((var init) ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...))))</p>
|
||
|
|
||
|
<p class=nopadding></p>
|
||
|
|
||
|
<p class=nopadding>(define-syntax letrec-helper</p>
|
||
|
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((letrec-helper</p>
|
||
|
|
||
|
<p class=nopadding> ()</p>
|
||
|
|
||
|
<p class=nopadding> (temp ...)</p>
|
||
|
|
||
|
<p class=nopadding> ((var init) ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let ((var <undefined>) ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let ((temp init) ...)</p>
|
||
|
|
||
|
<p class=nopadding> (set! var temp)</p>
|
||
|
|
||
|
<p class=nopadding> ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let () body1 body2 ...)))</p>
|
||
|
|
||
|
<p class=nopadding> ((letrec-helper</p>
|
||
|
|
||
|
<p class=nopadding> (x y ...)</p>
|
||
|
|
||
|
<p class=nopadding> (temp ...)</p>
|
||
|
|
||
|
<p class=nopadding> ((var init) ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (letrec-helper</p>
|
||
|
|
||
|
<p class=nopadding> (y ...)</p>
|
||
|
|
||
|
<p class=nopadding> (newtemp temp ...)</p>
|
||
|
|
||
|
<p class=nopadding> ((var init) ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...))))</p>
|
||
|
<p></tt></p>
|
||
|
<p>
|
||
|
The syntax <tt><undefined></tt> represents an expression that
|
||
|
returns something that, when stored in a location, causes an exception
|
||
|
with condition type <tt>&assertion</tt> to
|
||
|
be raised if an attempt to read from or write to the location occurs before the
|
||
|
assignments generated by the <tt>letrec</tt> transformation take place.
|
||
|
(No such expression is defined in Scheme.)</p>
|
||
|
<p>
|
||
|
A simpler definition using <tt>syntax-case</tt> and <tt>generate-temporaries</tt> is given in library
|
||
|
chapter on “<tt>syntax-case</tt>”.</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<a name="node_sec_Temp_40"></a>
|
||
|
<h4 class=section><a href="r6rs-Z-H-2.html#node_toc_node_sec_Temp_40"><tt>letrec*</tt></a></h4>
|
||
|
<p>The <tt>letrec*</tt> keyword could be defined approximately in terms of
|
||
|
<tt>let</tt> and <tt>set!</tt> using <tt>syntax-rules</tt> as follows:</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
|
||
|
<tt>(define-syntax <tt>letrec*</tt>
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((letrec* ((var1 init1) ...) body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let ((var1 <undefined>) ...)</p>
|
||
|
|
||
|
<p class=nopadding> (set! var1 init1)</p>
|
||
|
|
||
|
<p class=nopadding> ...</p>
|
||
|
|
||
|
<p class=nopadding> (let () body1 body2 ...)))))</p>
|
||
|
<p></tt></p>
|
||
|
<p>
|
||
|
The syntax <tt><undefined></tt> is as in the definition of <tt>letrec</tt> above.</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<a name="node_sec_Temp_41"></a>
|
||
|
<h4 class=section><a href="r6rs-Z-H-2.html#node_toc_node_sec_Temp_41"><tt>let-values</tt></a></h4>
|
||
|
<p>The following definition of <tt>let-values</tt> (section <a href="r6rs-Z-H-14.html#node_sec_11.4.6">11.4.6</a>)
|
||
|
using <tt>syntax-rules</tt>
|
||
|
employs a pair of helpers to
|
||
|
create temporary names for the formals.</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
|
||
|
<tt>(define-syntax let-values
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((let-values (binding ...) body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let-values-helper1</p>
|
||
|
|
||
|
<p class=nopadding> ()</p>
|
||
|
|
||
|
<p class=nopadding> (binding ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...))))</p>
|
||
|
|
||
|
<p class=nopadding></p>
|
||
|
|
||
|
<p class=nopadding>(define-syntax let-values-helper1</p>
|
||
|
|
||
|
<p class=nopadding> ;; map over the bindings</p>
|
||
|
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((let-values</p>
|
||
|
|
||
|
<p class=nopadding> ((id temp) ...)</p>
|
||
|
|
||
|
<p class=nopadding> ()</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let ((id temp) ...) body1 body2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> ((let-values</p>
|
||
|
|
||
|
<p class=nopadding> assocs</p>
|
||
|
|
||
|
<p class=nopadding> ((formals1 expr1) (formals2 expr2) ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let-values-helper2</p>
|
||
|
|
||
|
<p class=nopadding> formals1</p>
|
||
|
|
||
|
<p class=nopadding> ()</p>
|
||
|
|
||
|
<p class=nopadding> expr1</p>
|
||
|
|
||
|
<p class=nopadding> assocs</p>
|
||
|
|
||
|
<p class=nopadding> ((formals2 expr2) ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...))))</p>
|
||
|
|
||
|
<p class=nopadding></p>
|
||
|
|
||
|
<p class=nopadding>(define-syntax let-values-helper2</p>
|
||
|
|
||
|
<p class=nopadding> ;; create temporaries for the formals</p>
|
||
|
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((let-values-helper2</p>
|
||
|
|
||
|
<p class=nopadding> ()</p>
|
||
|
|
||
|
<p class=nopadding> temp-formals</p>
|
||
|
|
||
|
<p class=nopadding> expr1</p>
|
||
|
|
||
|
<p class=nopadding> assocs</p>
|
||
|
|
||
|
<p class=nopadding> bindings</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (call-with-values</p>
|
||
|
|
||
|
<p class=nopadding> (lambda () expr1)</p>
|
||
|
|
||
|
<p class=nopadding> (lambda temp-formals</p>
|
||
|
|
||
|
<p class=nopadding> (let-values-helper1</p>
|
||
|
|
||
|
<p class=nopadding> assocs</p>
|
||
|
|
||
|
<p class=nopadding> bindings</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...))))</p>
|
||
|
|
||
|
<p class=nopadding> ((let-values-helper2</p>
|
||
|
|
||
|
<p class=nopadding> (first . rest)</p>
|
||
|
|
||
|
<p class=nopadding> (temp ...)</p>
|
||
|
|
||
|
<p class=nopadding> expr1</p>
|
||
|
|
||
|
<p class=nopadding> (assoc ...)</p>
|
||
|
|
||
|
<p class=nopadding> bindings</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let-values-helper2</p>
|
||
|
|
||
|
<p class=nopadding> rest</p>
|
||
|
|
||
|
<p class=nopadding> (temp ... newtemp)</p>
|
||
|
|
||
|
<p class=nopadding> expr1</p>
|
||
|
|
||
|
<p class=nopadding> (assoc ... (first newtemp))</p>
|
||
|
|
||
|
<p class=nopadding> bindings</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> ((let-values-helper2</p>
|
||
|
|
||
|
<p class=nopadding> rest-formal</p>
|
||
|
|
||
|
<p class=nopadding> (temp ...)</p>
|
||
|
|
||
|
<p class=nopadding> expr1</p>
|
||
|
|
||
|
<p class=nopadding> (assoc ...)</p>
|
||
|
|
||
|
<p class=nopadding> bindings</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (call-with-values</p>
|
||
|
|
||
|
<p class=nopadding> (lambda () expr1)</p>
|
||
|
|
||
|
<p class=nopadding> (lambda (temp ... . newtemp)</p>
|
||
|
|
||
|
<p class=nopadding> (let-values-helper1</p>
|
||
|
|
||
|
<p class=nopadding> (assoc ... (rest-formal newtemp))</p>
|
||
|
|
||
|
<p class=nopadding> bindings</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...))))))</p>
|
||
|
<p></tt></p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<a name="node_sec_Temp_42"></a>
|
||
|
<h4 class=section><a href="r6rs-Z-H-2.html#node_toc_node_sec_Temp_42"><tt>let*-values</tt></a></h4>
|
||
|
<p>The following macro defines <tt>let*-values</tt> in terms of <tt>let</tt>
|
||
|
and <tt>let-values</tt> using <tt>syntax-rules</tt>:</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
|
||
|
<tt>(define-syntax let*-values
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((let*-values () body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let () body1 body2 ...))</p>
|
||
|
|
||
|
<p class=nopadding> ((let*-values (binding1 binding2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> (let-values (binding1)</p>
|
||
|
|
||
|
<p class=nopadding> (let*-values (binding2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)))))</p>
|
||
|
<p></tt></p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<a name="node_sec_Temp_43"></a>
|
||
|
<h4 class=section><a href="r6rs-Z-H-2.html#node_toc_node_sec_Temp_43"><tt>let</tt></a></h4>
|
||
|
<p>The <tt>let</tt> keyword could be defined in terms of <tt>lambda</tt> and <tt>letrec</tt>
|
||
|
using <tt>syntax-rules</tt> as
|
||
|
follows:</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
|
||
|
<tt>(define-syntax <tt>let</tt>
|
||
|
<p class=nopadding> (syntax-rules ()</p>
|
||
|
|
||
|
<p class=nopadding> ((let ((name val) ...) body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> ((lambda (name ...) body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> val ...))</p>
|
||
|
|
||
|
<p class=nopadding> ((let tag ((name val) ...) body1 body2 ...)</p>
|
||
|
|
||
|
<p class=nopadding> ((letrec ((tag (lambda (name ...)</p>
|
||
|
|
||
|
<p class=nopadding> body1 body2 ...)))</p>
|
||
|
|
||
|
<p class=nopadding> tag)</p>
|
||
|
|
||
|
<p class=nopadding> val ...))))</p>
|
||
|
<p></tt></p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<p></p>
|
||
|
<div class=smallskip></div>
|
||
|
<p style="margin-top: 0pt; margin-bottom: 0pt">
|
||
|
<div align=right class=navigation>[Go to <span><a href="r6rs.html">first</a>, <a href="r6rs-Z-H-15.html">previous</a></span><span>, <a href="r6rs-Z-H-17.html">next</a></span> page<span>; </span><span><a href="r6rs-Z-H-2.html#node_toc_start">contents</a></span><span><span>; </span><a href="r6rs-Z-H-21.html#node_index_start">index</a></span>]</div>
|
||
|
</p>
|
||
|
<p></p>
|
||
|
</div>
|
||
|
</body>
|
||
|
</html>
|