Definitions.xhtml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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>Definitions</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="Variables-and-Patterns.xhtml" title="Variables and Patterns"/>
  10. <link rel="next" href="Local-binding-constructs.xhtml" title="Local binding constructs"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="Definitions" epub:type="subchapter" id="Definitions">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">Definitions</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p>A variable definition binds one or more identifiers and specifies
  23. an initial value for each of them. The simplest kind of
  24. variable definition takes one of the following forms:
  25. </p>
  26. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878264176" class="indexterm"/> <code class="function">!</code> <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><a class="link" href="Primitive-expression-syntax.xhtml#meta-expression"><em class="replaceable"><code>expression</code></em></a></code></em></p>
  27. <div class="blockquote">
  28. <blockquote class="blockquote">
  29. <p>Evaluate <a class="link" href="Primitive-expression-syntax.xhtml#meta-expression"><em class="replaceable"><code>expression</code></em></a>, and match the result against <em class="replaceable"><code>pattern</code></em>.
  30. Defining variables in <a class="link" href="Variables-and-Patterns.xhtml#meta-pattern"><em class="replaceable"><code>pattern</code></em></a> becomes bound in the
  31. current (surrounding) scope.
  32. </p>
  33. <p>This is similar to <code class="literal">define-constant</code> except generalized to a <em class="replaceable"><code>pattern</code></em>.
  34. </p>
  35. </blockquote>
  36. </div>
  37. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878255888" class="indexterm"/> <code class="function">define</code> <em class="replaceable"><code>name</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><a class="link" href="Primitive-expression-syntax.xhtml#meta-expression"><em class="replaceable"><code>expression</code></em></a></code></em></p>
  38. <div class="blockquote">
  39. <blockquote class="blockquote">
  40. <p>Evaluate the <em class="replaceable"><code>expression</code></em>, optionally converting it to <em class="replaceable"><code>type</code></em>,
  41. and bind the <em class="replaceable"><code>name</code></em> to the result.
  42. </p>
  43. </blockquote>
  44. </div>
  45. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878248480" class="indexterm"/> <code class="function">define</code> (<em class="replaceable"><code>name</code></em> <em class="replaceable"><code><a class="link" href="Extended-formals.xhtml#meta-formal-arguments"><em class="replaceable"><code>formal-arguments</code></em></a></code></em>) (<em class="replaceable"><code><a class="link" href="Annotations.xhtml#meta-annotation"><em class="replaceable"><code>annotation</code></em></a></code></em> <em class="replaceable"><code>|</code></em> <em class="replaceable"><code><a class="link" href="Defining-new-classes.xhtml#meta-option-pair"><em class="replaceable"><code>option-pair</code></em></a></code></em>)<em class="replaceable"><code><sup>*</sup></code></em> <em class="replaceable"><code><a class="link" href="Extended-formals.xhtml#meta-opt-return-type"><em class="replaceable"><code>opt-return-type</code></em></a></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>
  46. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878239984" class="indexterm"/> <code class="function">define</code> (<em class="replaceable"><code>name</code></em> <em class="replaceable"><code><span class="bold"><strong>.</strong></span></code></em> <em class="replaceable"><code><a class="link" href="Extended-formals.xhtml#meta-rest-arg"><em class="replaceable"><code>rest-arg</code></em></a></code></em>) (<em class="replaceable"><code><a class="link" href="Annotations.xhtml#meta-annotation"><em class="replaceable"><code>annotation</code></em></a></code></em> <em class="replaceable"><code>|</code></em> <em class="replaceable"><code><a class="link" href="Defining-new-classes.xhtml#meta-option-pair"><em class="replaceable"><code>option-pair</code></em></a></code></em>)<em class="replaceable"><code><sup>*</sup></code></em> <em class="replaceable"><code><a class="link" href="Extended-formals.xhtml#meta-opt-return-type"><em class="replaceable"><code>opt-return-type</code></em></a></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>
  47. <div class="blockquote">
  48. <blockquote class="blockquote">
  49. <p>Bind the <em class="replaceable"><code>name</code></em> to a function definition. The form:
  50. </p>
  51. <pre class="screen">(define (<em class="replaceable"><code>name</code></em> <a class="link" href="Extended-formals.xhtml#meta-formal-arguments"><em class="replaceable"><code>formal-arguments</code></em></a>) <a class="link" href="Defining-new-classes.xhtml#meta-option-pair"><em class="replaceable"><code>option-pair</code></em></a><sup>*</sup> <a class="link" href="Extended-formals.xhtml#meta-opt-return-type"><em class="replaceable"><code>opt-return-type</code></em></a> <a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a>)
  52. </pre>
  53. <p>is equivalent to:
  54. </p>
  55. <pre class="screen">(define <em class="replaceable"><code>name</code></em> (lambda <a class="link" href="Extended-formals.xhtml#meta-formal-arguments"><em class="replaceable"><code>formal-arguments</code></em></a>) name: <em class="replaceable"><code>name</code></em> <a class="link" href="Defining-new-classes.xhtml#meta-option-pair"><em class="replaceable"><code>option-pair</code></em></a><sup>*</sup> <a class="link" href="Extended-formals.xhtml#meta-opt-return-type"><em class="replaceable"><code>opt-return-type</code></em></a> <a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a>))
  56. </pre>
  57. <p>while the form:
  58. </p>
  59. <pre class="screen">(define (<em class="replaceable"><code>name</code></em> . <a class="link" href="Extended-formals.xhtml#meta-rest-arg"><em class="replaceable"><code>rest-arg</code></em></a>) <a class="link" href="Defining-new-classes.xhtml#meta-option-pair"><em class="replaceable"><code>option-pair</code></em></a><sup>*</sup> <a class="link" href="Extended-formals.xhtml#meta-opt-return-type"><em class="replaceable"><code>opt-return-type</code></em></a> <a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a>)
  60. </pre>
  61. <p>is equivalent to:
  62. </p>
  63. <pre class="screen">(define <em class="replaceable"><code>name</code></em> (lambda <a class="link" href="Extended-formals.xhtml#meta-rest-arg"><em class="replaceable"><code>rest-arg</code></em></a>) name: <em class="replaceable"><code>name</code></em> <a class="link" href="Defining-new-classes.xhtml#meta-option-pair"><em class="replaceable"><code>option-pair</code></em></a><sup>*</sup> <a class="link" href="Extended-formals.xhtml#meta-opt-return-type"><em class="replaceable"><code>opt-return-type</code></em></a> <a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a>))
  64. </pre>
  65. <p>You can associate <a class="link" href="Annotations.xhtml" title="Annotations of declarations">annotations</a> with <em class="replaceable"><code>name</code></em>.
  66. A field annotation will be associated with the generated field;
  67. a method annotation will be associated with the generated method(s).
  68. </p>
  69. </blockquote>
  70. </div>
  71. <p>In addition to <code class="literal">define</code> (which can take an optional type specifier),
  72. Kawa has some extra definition forms.
  73. </p>
  74. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878208272" class="indexterm"/> <code class="function">define-private</code> <em class="replaceable"><code>name</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>value</code></em></p>
  75. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878203296" class="indexterm"/> <code class="function">define-private</code> (<em class="replaceable"><code>name</code></em> <em class="replaceable"><code>formals</code></em>) <em class="replaceable"><code>body</code></em></p>
  76. <div class="blockquote">
  77. <blockquote class="blockquote">
  78. <p>Same as <code class="literal">define</code>, except that <code class="literal">name</code> is not exported.
  79. </p>
  80. </blockquote>
  81. </div>
  82. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878198192" class="indexterm"/> <code class="function">define-constant</code> <em class="replaceable"><code>name</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>value</code></em></p>
  83. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878193216" class="indexterm"/> <code class="function">define-early-constant</code> <em class="replaceable"><code>name</code></em> [<em class="replaceable"><code>::</code></em> <em class="replaceable"><code>type</code></em>] <em class="replaceable"><code>value</code></em></p>
  84. <div class="blockquote">
  85. <blockquote class="blockquote">
  86. <p>Defines <em class="replaceable"><code>name</code></em> to have the given <em class="replaceable"><code>value</code></em>.
  87. The value is readonly, and you cannot assign to it.
  88. (This is not fully enforced.)
  89. </p>
  90. <p>If <code class="literal">define-early-constant</code> is used
  91. <span class="emphasis"><em>or</em></span> the <em class="replaceable"><code>value</code></em> is a compile-time constant,
  92. then the compiler will create a <code class="literal">final</code> field with
  93. the given name and type, and evaluate <em class="replaceable"><code>value</code></em>
  94. in the module’s class initializer (if the definition
  95. is static) or constructor (if the definition is non-static),
  96. before other definitions and expressions.
  97. Otherwise, the <em class="replaceable"><code>value</code></em> is evaluated in the module body
  98. where it appears.
  99. </p>
  100. <p>If the <em class="replaceable"><code>value</code></em> is a compile-time constant,
  101. then the definition defaults to being static.
  102. </p>
  103. </blockquote>
  104. </div>
  105. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667878183216" class="indexterm"/> <code class="function">define-variable</code> <em class="replaceable"><code>name</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>]</p>
  106. <div class="blockquote">
  107. <blockquote class="blockquote">
  108. <p>If <em class="replaceable"><code>init</code></em> is specified and <em class="replaceable"><code>name</code></em> does not have a global variable
  109. binding, then <em class="replaceable"><code>init</code></em> is evaluated, and <em class="replaceable"><code>name</code></em> bound to the result.
  110. Otherwise, the value bound to <em class="replaceable"><code>name</code></em> does not change.
  111. (Note that <em class="replaceable"><code>init</code></em> is not evaluated
  112. if <em class="replaceable"><code>name</code></em> does have a global variable binding.)
  113. </p>
  114. <p>Also, declares to the compiler that <em class="replaceable"><code>name</code></em> will be looked up
  115. in the per-thread dynamic environment. This can be useful for shutting up
  116. warnings from <code class="literal">--warn-undefined-variable</code>.
  117. </p>
  118. <p>This is similar to the Common Lisp <code class="literal">defvar</code> form.
  119. However, the Kawa version is (currently) only allowed at module level.
  120. </p>
  121. </blockquote>
  122. </div>
  123. <p>For <code class="literal">define-namespace</code> and <code class="literal">define-private-namespace</code>
  124. see <a class="link" href="Namespaces.xhtml" title="Namespaces and compound symbols">Namespaces</a>.
  125. </p>
  126. </section>
  127. <footer>
  128. <div class="navfooter">
  129. <p>
  130. Up: <a accesskey="u" href="Program-structure.xhtml">Program structure</a></p>
  131. <p>
  132. Previous: <a accesskey="p" href="Variables-and-Patterns.xhtml">Variables and Patterns</a></p>
  133. <p>
  134. Next: <a accesskey="n" href="Local-binding-constructs.xhtml">Local binding constructs</a></p>
  135. </div>
  136. </footer>
  137. </body>
  138. </html>