Local-binding-constructs.xhtml 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:pls="http://www.w3.org/2005/01/pronunciation-lexicon" xmlns:ssml="http://www.w3.org/2001/10/synthesis" xmlns:svg="http://www.w3.org/2000/svg">
  3. <head>
  4. <title>Local binding constructs</title>
  5. <link rel="stylesheet" type="text/css" href="docbook-epub.css"/>
  6. <link rel="stylesheet" type="text/css" href="kawa.css"/>
  7. <script src="kawa-ebook.js" type="text/javascript"/>
  8. <meta name="generator" content="DocBook XSL-NS Stylesheets V1.79.1"/>
  9. <link rel="prev" href="Overall-Index.xhtml" title="Index"/>
  10. <link rel="next" href="Lazy-evaluation.xhtml" title="Lazy evaluation"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="Local binding constructs" epub:type="subchapter" id="Local-binding-constructs">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">Local binding constructs</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p>The binding constructs <code class="literal">let</code>, <code class="literal">let*</code>, <code class="literal">letrec</code>,
  23. and <code class="literal">letrec*</code> give Scheme a block structure, like Algol 60.
  24. The syntax of these four constructs
  25. is identical, but they differ in the regions they establish
  26. for their variable bindings. In a <code class="literal">let</code> expression, the initial
  27. values are computed before any of the variables become
  28. bound; in a <code class="literal">let*</code> expression, the bindings and evaluations
  29. are performed sequentially; while in <code class="literal">letrec</code> and <code class="literal">letrec*</code>
  30. expressions, all the bindings are in effect while their initial
  31. values are being computed, thus allowing mutually recursive definitions.
  32. </p>
  33. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878162832" class="indexterm"/> <code class="function">let</code> <em class="replaceable"><code><span class="bold"><strong>((</strong></span></code></em><em class="replaceable"><code><a class="link" href="Variables-and-Patterns.xhtml#meta-pattern"><em class="replaceable"><code>pattern</code></em></a></code></em> <em class="replaceable"><code><em class="replaceable"><code>init</code></em></code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code>...</code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code><a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a></code></em></p>
  34. <div class="blockquote">
  35. <blockquote class="blockquote">
  36. <p>Declare new local variables as found in the <em class="replaceable"><code>pattern</code></em>s.
  37. Each <em class="replaceable"><code>pattern</code></em> is matched against the corresponding <em class="replaceable"><code>init</code></em>.
  38. The <em class="replaceable"><code>init</code></em>s are evaluated in the current environment (in left-to-right
  39. onder), the <em class="replaceable"><code>variable</code></em>s in the <em class="replaceable"><code>patterns</code></em>s are bound to fresh
  40. locations holding the matched results,
  41. the <em class="replaceable"><code>body</code></em> is evaluated in the extended environment, and the values of
  42. the last expression of body are returned.
  43. Each binding of a variable has <em class="replaceable"><code>body</code></em> as its region.
  44. </p>
  45. <pre class="screen">(let ((x 2) (y 3))
  46. (* x y)) ⇒ 6
  47. </pre>
  48. <pre class="screen">(let ((x 2) (y 3))
  49. (let ((x 7)
  50. (z (+ x y)))
  51. (* z x))) ⇒ 35
  52. </pre>
  53. <p>An example with a non-trivial pattern:
  54. </p>
  55. <pre class="screen">(let (([a::double b::integer] (vector 4 5)))
  56. (cons b a)) ⇒ (5 . 4.0)
  57. </pre>
  58. </blockquote>
  59. </div>
  60. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878149392" class="indexterm"/> <code class="function">let*</code> <em class="replaceable"><code><span class="bold"><strong>((</strong></span></code></em><em class="replaceable"><code><a class="link" href="Variables-and-Patterns.xhtml#meta-pattern"><em class="replaceable"><code>pattern</code></em></a></code></em> <em class="replaceable"><code>init</code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code>...</code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code><a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a></code></em></p>
  61. <div class="blockquote">
  62. <blockquote class="blockquote">
  63. <p>The <code class="literal">let*</code> binding construct is similar to <code class="literal">let</code>,
  64. but the bindings are performed sequentially from left to
  65. right, and the region of a <em class="replaceable"><code>variable</code></em>s in a <em class="replaceable"><code>pattern</code></em>
  66. is that part of the <code class="literal">let*</code> expression to the right of
  67. the <em class="replaceable"><code>pattern</code></em>. Thus the second pattern is matched in an environment
  68. in which the bindings from the first pattern are visible, and so on.
  69. </p>
  70. <pre class="screen">(let ((x 2) (y 3))
  71. (let* ((x 7)
  72. (z (+ x y)))
  73. (* z x))) ⇒ 70
  74. </pre>
  75. </blockquote>
  76. </div>
  77. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878138240" class="indexterm"/> <code class="function">letrec</code> <em class="replaceable"><code><span class="bold"><strong>((</strong></span></code></em><em class="replaceable"><code>variable</code></em> [<em class="replaceable"><code><span class="bold"><strong>::</strong></span></code></em> <em class="replaceable"><code><a class="link" href="Types.xhtml#meta-type"><em class="replaceable"><code>type</code></em></a></code></em>] <em class="replaceable"><code>init</code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code>...</code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code><a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a></code></em></p>
  78. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878129968" class="indexterm"/> <code class="function">letrec*</code> <em class="replaceable"><code><span class="bold"><strong>((</strong></span></code></em><em class="replaceable"><code>variable</code></em> [<em class="replaceable"><code><span class="bold"><strong>::</strong></span></code></em> <em class="replaceable"><code><a class="link" href="Types.xhtml#meta-type"><em class="replaceable"><code>type</code></em></a></code></em>] <em class="replaceable"><code>init</code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code>...</code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code><a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a></code></em></p>
  79. <div class="blockquote">
  80. <blockquote class="blockquote">
  81. <p>The <em class="replaceable"><code>variable</code></em>s are bound to fresh locations,
  82. each <em class="replaceable"><code>variable</code></em> is assigned in left-to-right order
  83. to the result of the corresponding <em class="replaceable"><code>init</code></em>,
  84. the <em class="replaceable"><code>body</code></em> is evaluated in the resulting environment,
  85. and the values of the last expression in body are returned.
  86. Despite the left-to-right evaluation and assignment order, each binding of a
  87. <em class="replaceable"><code>variable</code></em> has the entire <code class="literal">letrec</code> or <code class="literal">letrec*</code>
  88. expression as its region,
  89. making it possible to define mutually recursive procedures.
  90. </p>
  91. <p>In Kawa <code class="literal">letrec</code> is defined as the same as <code class="literal">letrec*</code>.
  92. In standard Scheme the order of evaluation of the <em class="replaceable"><code>init</code></em>s
  93. is undefined, as is the order of assignments.
  94. If the order matters, you should use <code class="literal">letrec*</code>.
  95. </p>
  96. <p>If it is not possible to evaluate each <em class="replaceable"><code>init</code></em> without assigning
  97. or referring to the value of the corresponding <em class="replaceable"><code>variable</code></em>
  98. or the variables that follow it, it is an error.
  99. </p>
  100. <pre class="screen">(letrec ((even?
  101. (lambda (n)
  102. (if (zero? n)
  103. #t
  104. (odd? (- n 1)))))
  105. (odd?
  106. (lambda (n)
  107. (if (zero? n)
  108. #f
  109. (even? (- n 1))))))
  110. (even? 88))
  111. ⇒ #t
  112. </pre>
  113. </blockquote>
  114. </div>
  115. </section>
  116. <footer>
  117. <div class="navfooter">
  118. <p>
  119. Up: <a accesskey="u" href="Program-structure.xhtml">Program structure</a></p>
  120. <p>
  121. Previous: <a accesskey="p" href="Definitions.xhtml">Definitions</a></p>
  122. <p>
  123. Next: <a accesskey="n" href="Lazy-evaluation.xhtml">Lazy evaluation</a></p>
  124. </div>
  125. </footer>
  126. </body>
  127. </html>