Defining-new-classes.xhtml 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  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>Defining new classes</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="Objects-Classes-and-Modules.xhtml" title="Object, Classes and Modules"/>
  10. <link rel="next" href="Anonymous-classes.xhtml" title="Anonymous classes"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="Defining new classes" epub:type="subchapter" id="Defining-new-classes">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">Defining new classes</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p>Kawa provides various mechanisms for defining new classes.
  23. The <code class="literal">define-class</code> and <code class="literal">define-simple-class</code> forms
  24. will usually be the preferred mechanisms. They have basically
  25. the same syntax, but have a couple of differences.
  26. <code class="literal">define-class</code> allows multiple inheritance as well as true nested
  27. (first-class) class objects. However, the implementation
  28. is more complex: code using it is slightly slower, and the mapping to
  29. Java classes is a little less obvious. (Each Scheme class is implemented
  30. as a pair of an interface and an implementation class.)
  31. A class defined by <code class="literal">define-simple-class</code> is slightly more
  32. efficient, and it is easier to access it from Java code.
  33. </p>
  34. <p>The syntax of <code class="literal">define-class</code> are mostly compatible with that
  35. in the Guile and Stk dialects of Scheme.
  36. </p>
  37. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667871881296" class="indexterm"/> <code class="function">define-class</code> <em class="replaceable"><code><a class="link" href="Defining-new-classes.xhtml#meta-class-name"><em class="replaceable"><code>class-name</code></em></a></code></em> <em class="replaceable"><code><span class="bold"><strong>(</strong></span></code></em><em class="replaceable"><code>supers</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="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="Defining-new-classes.xhtml#meta-field-or-method-decl"><em class="replaceable"><code>field-or-method-decl</code></em></a></code></em> <em class="replaceable"><code>...</code></em></p>
  38. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667871871952" class="indexterm"/> <code class="function">define-simple-class</code> <em class="replaceable"><code><a class="link" href="Defining-new-classes.xhtml#meta-class-name"><em class="replaceable"><code>class-name</code></em></a></code></em> <em class="replaceable"><code><span class="bold"><strong>(</strong></span></code></em><em class="replaceable"><code>supers</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="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="Defining-new-classes.xhtml#meta-field-or-method-decl"><em class="replaceable"><code>field-or-method-decl</code></em></a></code></em> <em class="replaceable"><code>...</code></em></p>
  39. <div class="blockquote">
  40. <blockquote class="blockquote">
  41. <p>Defines a new class named <em class="replaceable"><code>class-name</code></em>. If <code class="literal">define-simple-class</code> is
  42. used, creates a normal Java class named <em class="replaceable"><code>class-name</code></em> in the current package.
  43. (If <em class="replaceable"><code>class-name</code></em> has the form <code class="literal">&lt;xyz&gt;</code> the Java implementation
  44. type is named <code class="literal">xyz</code>.) For <code class="literal">define-class</code> the implementation is
  45. unspecified. In most cases, the compiler creates a class pair,
  46. consisting of a Java interface and a Java implementation class.
  47. </p>
  48. </blockquote>
  49. </div>
  50. <div class="literallayout">
  51. <p><a id="idm139667871858704" class="indexterm"/><span id="meta-class-name"/><em class="replaceable"><code>class-name</code></em> <code class="literal">::=</code> <a class="link" href="Lexical-syntax.xhtml#meta-identifier"><em class="replaceable"><code>identifier</code></em></a><br/>
  52. <a id="idm139667871855904" class="indexterm"/><span id="meta-option-pair"/><em class="replaceable"><code>option-pair</code></em> <code class="literal">::=</code> <em class="replaceable"><code>option-keyword</code></em> <em class="replaceable"><code>option-value</code></em><br/>
  53. <a id="idm139667871853088" class="indexterm"/><span id="meta-field-or-method-decl"/><em class="replaceable"><code>field-or-method-decl</code></em> <code class="literal">::=</code> <a class="link" href="Defining-new-classes.xhtml#meta-field-decl"><em class="replaceable"><code>field-decl</code></em></a> | <a class="link" href="Defining-new-classes.xhtml#meta-method-decl"><em class="replaceable"><code>method-decl</code></em></a><br/>
  54. </p>
  55. </div>
  56. <section class="sect2" title="General class properties" epub:type="division" id="idm139667871849328">
  57. <div class="titlepage">
  58. <div>
  59. <div>
  60. <h3 class="title">General class properties</h3>
  61. </div>
  62. </div>
  63. </div>
  64. <p>The class inherits from the classes and interfaces listed in <em class="replaceable"><code>supers</code></em>.
  65. This is a list of names of classes that are in scope (perhaps imported
  66. using <code class="literal">require</code>), or names for existing classes or interfaces
  67. optionally surrounded by <code class="literal">&lt;&gt;</code>, such as <code class="literal">&lt;gnu.lists.Sequence&gt;</code>.
  68. If <code class="literal">define-simple-class</code> is used, at most one of these may be
  69. the name of a normal Java class or classes defined using
  70. <code class="literal">define-simple-class</code>; the rest must be interfaces or classes
  71. defined using <code class="literal">define-class</code>.
  72. If <code class="literal">define-class</code> is used, <span class="emphasis"><em>all</em></span> of the classes listed
  73. in <em class="replaceable"><code>supers</code></em> should be interfaces or classes defined using
  74. <code class="literal">define-class</code>.
  75. </p>
  76. <div class="variablelist" epub:type="list">
  77. <dl class="variablelist">
  78. <dt class="term"><code class="literal"><span class="bold"><strong>interface:</strong></span></code> <em class="replaceable"><code>make-interface</code></em>
  79. </dt>
  80. <dd>
  81. <p>Specifies whether Kawa generates a Java class, interface, or both.
  82. If <em class="replaceable"><code>make-interface</code></em> is <code class="literal">#t</code>, then a Java interface is generated.
  83. In that case all the supertypes must be interfaces, and
  84. all the declared methods must be abstract.
  85. If <em class="replaceable"><code>make-interface</code></em> is <code class="literal">#f</code>, then a Java class is generated.
  86. If <code class="literal">interface:</code> is unspecified, the default is <code class="literal">#f</code>
  87. for <code class="literal">define-simple-class</code>. For <code class="literal">define-class</code> the default
  88. is to generate an interface, and in addition (if needed) a helper
  89. class that implements the interface. (In that case any non-abstract methods
  90. are compiled to static methods. The methods that implement the interface
  91. are just wrapper methods that call the real static methods. This
  92. allows Kawa to implement true multiple inheritance.)
  93. </p>
  94. </dd>
  95. <dt class="term"><code class="literal"><span class="bold"><strong>access:</strong></span></code> <em class="replaceable"><code>kind</code></em>
  96. </dt>
  97. <dd>
  98. <p>Specifies the Java access permission on the class.
  99. Can be one of <code class="literal">'public</code> (which is the default in Kawa),
  100. <code class="literal">'package</code> (which the default "unnamed" permission in Java code),
  101. <code class="literal">'protected</code>, <code class="literal">'private</code>,
  102. <code class="literal">'volatile</code>, or <code class="literal">'transient</code>.
  103. Can also be used to specify <code class="literal">final</code>, <code class="literal">abstract</code>, or <code class="literal">enum</code>, as in Java.
  104. (You don’t need to explicitly specify the class is <code class="literal">abstract</code>
  105. if any <em class="replaceable"><code>method-body</code></em> is <code class="literal">#!abstract</code>,
  106. or you specify <code class="literal">interface: #t</code>.)
  107. The <em class="replaceable"><code>kind</code></em> can also be a list, as for example:
  108. </p>
  109. <pre class="screen">access: '(protected volatile)
  110. </pre>
  111. </dd>
  112. <dt class="term"><code class="literal"><span class="bold"><strong>class-name:</strong></span></code> <code class="literal">"</code><em class="replaceable"><code>cname</code></em><code class="literal">"</code>
  113. </dt>
  114. <dd>
  115. <p>Specifies the Java name of the created class.
  116. The <em class="replaceable"><code>name</code></em> specified after <code class="literal">define-class</code>
  117. or <code class="literal">define-simple-class</code> is the <span class="emphasis"><em>Scheme name</em></span>,
  118. i.e. the name of a Scheme variable that is bound to the class.
  119. The Java name is by default derived from the Scheme name,
  120. but you can override the default with a <code class="literal">class-name:</code> specifier.
  121. If the <em class="replaceable"><code>cname</code></em> has no periods, then it is a name in
  122. the package of the main (module) class.
  123. If the <em class="replaceable"><code>cname</code></em> starts with a period,
  124. then you get a class nested within the module class.
  125. In this case the actual class name is <em class="replaceable"><code>moduleClass</code></em><code class="literal">$</code><em class="replaceable"><code>rname</code></em>,
  126. where <em class="replaceable"><code>rname</code></em> is <em class="replaceable"><code>cname</code></em> without the initial period.
  127. To force a class in the top-level (unnamed) package (something
  128. not recommended) write a period at the end of the <em class="replaceable"><code>cname</code></em>.
  129. </p>
  130. </dd>
  131. </dl>
  132. </div>
  133. </section>
  134. <section class="sect2" title="Declaring fields" epub:type="division" id="idm139667871818992">
  135. <div class="titlepage">
  136. <div>
  137. <div>
  138. <h3 class="title">Declaring fields</h3>
  139. </div>
  140. </div>
  141. </div>
  142. <div class="literallayout">
  143. <p><a id="idm139667871817920" class="indexterm"/><span id="meta-field-decl"/><em class="replaceable"><code>field-decl</code></em> <code class="literal">::=</code> <code class="literal"><span class="bold"><strong>(</strong></span></code><a class="link" href="Defining-new-classes.xhtml#meta-field-name"><em class="replaceable"><code>field-name</code></em></a> (<a class="link" href="Annotations.xhtml#meta-annotation"><em class="replaceable"><code>annotation</code></em></a> | <a class="link" href="Types.xhtml#meta-opt-type-specifier"><em class="replaceable"><code>opt-type-specifier</code></em></a> | <a class="link" href="Defining-new-classes.xhtml#meta-field-option"><em class="replaceable"><code>field-option</code></em></a>)*<code class="literal"><span class="bold"><strong>)</strong></span></code><br/>
  144. <a id="idm139667871811184" class="indexterm"/><span id="meta-field-name"/><em class="replaceable"><code>field-name</code></em> <code class="literal">::=</code> <a class="link" href="Lexical-syntax.xhtml#meta-identifier"><em class="replaceable"><code>identifier</code></em></a><br/>
  145. <a id="idm139667871808384" class="indexterm"/><span id="meta-field-option"/><em class="replaceable"><code>field-option</code></em> <code class="literal">::=</code> <a class="link" href="Keywords.xhtml#meta-keyword"><em class="replaceable"><code>keyword</code></em></a> <a class="link" href="Primitive-expression-syntax.xhtml#meta-expression"><em class="replaceable"><code>expression</code></em></a><br/>
  146. </p>
  147. </div>
  148. <p>As a matter of style the following order is suggested, though this not enforced:
  149. </p>
  150. <div class="literallayout">
  151. <p><code class="literal"><span class="bold"><strong>(</strong></span></code><a class="link" href="Defining-new-classes.xhtml#meta-field-name"><em class="replaceable"><code>field-name</code></em></a> <a class="link" href="Annotations.xhtml#meta-annotation"><em class="replaceable"><code>annotation</code></em></a>* <a class="link" href="Types.xhtml#meta-opt-type-specifier"><em class="replaceable"><code>opt-type-specifier</code></em></a> <a class="link" href="Defining-new-classes.xhtml#meta-field-option"><em class="replaceable"><code>field-option</code></em></a>*<code class="literal"><span class="bold"><strong>)</strong></span></code><br/>
  152. </p>
  153. </div>
  154. <p>Each <em class="replaceable"><code>field-decl</code></em> declares a instance "slot" (field)
  155. with the given <em class="replaceable"><code>field-name</code></em>.
  156. By default it is publicly visible, but you can specify
  157. a different visiblity with the <code class="literal">access:</code> specifier.
  158. The following <em class="replaceable"><code>field-option</code></em> <em class="replaceable"><code>keyword</code></em>s are implemented:
  159. </p>
  160. <div class="variablelist" epub:type="list">
  161. <dl class="variablelist">
  162. <dt class="term"><code class="literal"><span class="bold"><strong>type:</strong></span></code> <a class="link" href="Types.xhtml#meta-type"><em class="replaceable"><code>type</code></em></a>
  163. </dt>
  164. <dd>
  165. <p>Specifies that <em class="replaceable"><code>type</code></em> is the type of (the values of) the field.
  166. Equivalent to ‘<code class="literal">:: <em class="replaceable"><code>type</code></em></code>’.
  167. </p>
  168. </dd>
  169. <dt class="term"><code class="literal"><span class="bold"><strong>allocation:</strong></span></code> <em class="replaceable"><code>kind</code></em>
  170. </dt>
  171. <dd>
  172. <p>If <em class="replaceable"><code>kind</code></em> is <code class="literal">'class</code> or <code class="literal">'static</code> a single slot is shared
  173. between all instances of the class (and its sub-classes).
  174. Not yet implemented for <code class="literal">define-class</code>,
  175. only for <code class="literal">define-simple-class</code>.
  176. In Java terms this is a <code class="literal">static</code> field.
  177. </p>
  178. <p>If <em class="replaceable"><code>kind</code></em> is <code class="literal">'instance</code> then
  179. each instance has a separate value "slot", and they
  180. are not shared. In Java terms, this is a non-<code class="literal">static</code> field.
  181. This is the default.
  182. </p>
  183. </dd>
  184. <dt class="term"><code class="literal"><span class="bold"><strong>access:</strong></span></code> <em class="replaceable"><code>kind</code></em>
  185. </dt>
  186. <dd>
  187. <p>Specifies the Java access permission on the field.
  188. Can be one of <code class="literal">'private</code>, <code class="literal">'protected</code>,
  189. <code class="literal">'public</code> (which is the default in Kawa),
  190. or <code class="literal">'package</code> (which the default "unnamed" permission
  191. in Java code).
  192. Can also be used to specify <code class="literal">volatile</code>, <code class="literal">transient</code>,
  193. <code class="literal">enum</code>, or <code class="literal">final</code>, as in Java,
  194. or a quoted list with these symbols.
  195. </p>
  196. </dd>
  197. <dt class="term"><code class="literal"><span class="bold"><strong>init:</strong></span></code> <em class="replaceable"><code>expr</code></em>
  198. </dt>
  199. <dd>
  200. <p>An expression used to initialize the slot.
  201. The expression is evaluated in a scope that includes the field and
  202. method names of the current class.
  203. </p>
  204. </dd>
  205. <dt class="term"><code class="literal"><span class="bold"><strong>init-form:</strong></span></code> <em class="replaceable"><code>expr</code></em>
  206. </dt>
  207. <dd>
  208. <p>An expression used to initialize the slot.
  209. The lexical environment of the <em class="replaceable"><code>expr</code></em> is that of the <code class="literal">define-class</code>;
  210. it does <span class="emphasis"><em>not</em></span> include the field and method names of the current class.
  211. or <code class="literal">define-simple-class</code>.
  212. </p>
  213. </dd>
  214. <dt class="term"><code class="literal"><span class="bold"><strong>init-value:</strong></span></code> <em class="replaceable"><code>value</code></em>
  215. </dt>
  216. <dd>
  217. <p>A value expression used to initialize the slot.
  218. For now this is synonymous with <em class="replaceable"><code>init-form:</code></em>, but that may change
  219. (depending on what other implementation do), so to be safe only use
  220. <code class="literal">init-value:</code> with a literal.
  221. </p>
  222. </dd>
  223. <dt class="term"><code class="literal"><span class="bold"><strong>init-keyword:</strong></span></code> <code class="literal"><em class="replaceable"><code>name</code></em>:</code>
  224. </dt>
  225. <dd>
  226. <p>A keyword that that can be used to initialize instance in <code class="literal">make</code> calls.
  227. For now, this is ignored, and <em class="replaceable"><code>name</code></em> should be the same as the
  228. field’s <em class="replaceable"><code>field-name</code></em>.
  229. </p>
  230. </dd>
  231. </dl>
  232. </div>
  233. <p>The <em class="replaceable"><code>field-name</code></em> can be left out. That indicates a "dummy slot",
  234. which is useful for initialization not tied to a specific field.
  235. In Java terms this is an instance or static initializer, i.e., a
  236. block of code executed when a new instance is created or the class is loaded.
  237. </p>
  238. <p>In this example, <code class="literal">x</code> is the only actual field. It is first
  239. initialized to 10, but if <code class="literal">(some-condition)</code> is true
  240. then its value is doubled.
  241. </p>
  242. <pre class="screen">(define-simple-class &lt;my-class&gt; ()
  243. (allocation: 'class
  244. init: (perform-actions-when-the-class-is-initizalized))
  245. (x init: 10)
  246. (init: (if (some-condition) (set! x (* x 2)))))
  247. </pre>
  248. </section>
  249. <section class="sect2" title="Declaring methods" epub:type="division" id="idm139667871763344">
  250. <div class="titlepage">
  251. <div>
  252. <div>
  253. <h3 class="title">Declaring methods</h3>
  254. </div>
  255. </div>
  256. </div>
  257. <div class="literallayout">
  258. <p><a id="idm139667871762272" class="indexterm"/><span id="meta-method-decl"/><em class="replaceable"><code>method-decl</code></em> <code class="literal">::=</code> <code class="literal"><span class="bold"><strong>((</strong></span></code><a class="link" href="Defining-new-classes.xhtml#meta-method-name"><em class="replaceable"><code>method-name</code></em></a> <a class="link" href="Extended-formals.xhtml#meta-formal-arguments"><em class="replaceable"><code>formal-arguments</code></em></a><code class="literal"><span class="bold"><strong>)</strong></span></code><br/>
  259.     <a class="link" href="Defining-new-classes.xhtml#meta-method-option"><em class="replaceable"><code>method-option</code></em></a><sup>*</sup> [<a class="link" href="Defining-new-classes.xhtml#meta-deprecated-return-specifier"><em class="replaceable"><code>deprecated-return-specifier</code></em></a>] <a class="link" href="Defining-new-classes.xhtml#meta-method-body"><em class="replaceable"><code>method-body</code></em></a><code class="literal"><span class="bold"><strong>)</strong></span></code><br/>
  260. <a id="idm139667871753952" class="indexterm"/><span id="meta-method-name"/><em class="replaceable"><code>method-name</code></em> <code class="literal">::=</code> <a class="link" href="Lexical-syntax.xhtml#meta-identifier"><em class="replaceable"><code>identifier</code></em></a><br/>
  261. <a id="idm139667871751152" class="indexterm"/><span id="meta-method-option"/><em class="replaceable"><code>method-option</code></em> <code class="literal">::=</code> <a class="link" href="Annotations.xhtml#meta-annotation"><em class="replaceable"><code>annotation</code></em></a> | <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="Defining-new-classes.xhtml#meta-option-pair"><em class="replaceable"><code>option-pair</code></em></a><br/>
  262. <a id="idm139667871746720" class="indexterm"/><span id="meta-method-body"/><em class="replaceable"><code>method-body</code></em> <code class="literal">::=</code> <a class="link" href="Bodies.xhtml#meta-body"><em class="replaceable"><code>body</code></em></a> | <code class="literal"><span class="bold"><strong>#!abstract</strong></span></code> | <code class="literal"><span class="bold"><strong>#!native</strong></span></code><br/>
  263. <a id="idm139667871742288" class="indexterm"/><span id="meta-deprecated-return-specifier"/><em class="replaceable"><code>deprecated-return-specifier</code></em> <code class="literal">::=</code> <a class="link" href="Lexical-syntax.xhtml#meta-identifier"><em class="replaceable"><code>identifier</code></em></a><br/>
  264. </p>
  265. </div>
  266. <p>Each <em class="replaceable"><code>method-decl</code></em> declares a method,
  267. which is by default public and non-static, and whose name is <em class="replaceable"><code>method-name</code></em>.
  268. (If <em class="replaceable"><code>method-name</code></em> is not a valid
  269. Java method name, it is mapped to something reasonable.
  270. For example <code class="literal">foo-bar?</code> is mapped to <code class="literal">isFooBar</code>.)
  271. The types of the method arguments can be specified in the
  272. <em class="replaceable"><code>formal-arguments</code></em>. The return type can be specified by
  273. a <em class="replaceable"><code>opt-return-type</code></em>, <em class="replaceable"><code>deprecated-return-specifier</code></em>,
  274. or is otherwise the type of the <em class="replaceable"><code>body</code></em>.
  275. Currently, the <em class="replaceable"><code>formal-arguments</code></em> cannot contain optional, rest,
  276. or keyword parameters. (The plan is to allow optional parameters,
  277. implemented using multiple overloaded methods.)
  278. </p>
  279. <p>A <em class="replaceable"><code>method-decl</code></em> in a <code class="literal">define-simple-class</code>
  280. can have the following <em class="replaceable"><code>option-keyword</code></em>s:
  281. </p>
  282. <div class="variablelist" epub:type="list">
  283. <dl class="variablelist">
  284. <dt class="term"><code class="literal"><span class="bold"><strong>access:</strong></span></code> <em class="replaceable"><code>kind</code></em>
  285. </dt>
  286. <dd>
  287. <p>Specifies the Java access permission on the method.
  288. Can be one of <code class="literal">'private</code>, <code class="literal">'protected</code>,
  289. <code class="literal">'public</code>, or <code class="literal">'package</code>.
  290. Can also be <code class="literal">'synchronized</code>, <code class="literal">'final</code>, <code class="literal">'strictfp</code>,
  291. or a quoted list.
  292. </p>
  293. </dd>
  294. <dt class="term"><code class="literal"><span class="bold"><strong>allocation:</strong></span></code> <em class="replaceable"><code>kind</code></em>
  295. </dt>
  296. <dd>
  297. <p>If <em class="replaceable"><code>kind</code></em> is <code class="literal">'class</code> or <code class="literal">'static</code> creates a static method.
  298. </p>
  299. </dd>
  300. <dt class="term"><code class="literal"><span class="bold"><strong>throws:</strong></span></code> ( <em class="replaceable"><code>exception-class-name</code></em> ... )
  301. </dt>
  302. <dd>
  303. <p>Specifies a list of checked exception that the method may throw.
  304. Equivalent to a <code class="literal">throws</code> specification in Java code.
  305. For example:
  306. </p>
  307. <pre class="screen">(define-simple-class T
  308. (prefix)
  309. ((lookup name) throws: (java.io.FileNotFoundException)
  310. (make java.io.FileReader (string-append prefix name))))
  311. </pre>
  312. </dd>
  313. </dl>
  314. </div>
  315. <p>The scope of the <em class="replaceable"><code>body</code></em> of a method includes the <em class="replaceable"><code>field-decl</code></em>s
  316. and <em class="replaceable"><code>method-decl</code></em>s of the class, including those inherited from
  317. superclasses and implemented interfaces.
  318. </p>
  319. <p>If the <em class="replaceable"><code>method-body</code></em> is the special form <code class="literal">#!abstract</code>,
  320. then the method is abstract. This means the method must
  321. be overridden in a subclass, and you’re not allowed to
  322. create an instance of the enclosing class.
  323. </p>
  324. <pre class="screen">(define-simple-class Searchable () interface: #t
  325. ((search value) :: boolean #!abstract))
  326. </pre>
  327. <p>If the <em class="replaceable"><code>method-body</code></em> is the special form <code class="literal">#!native</code>,
  328. then the method is native, implemented using <a class="ulink" href="http://en.wikipedia.org/wiki/Java_Native_Interface" target="_top">JNI</a>.
  329. </p>
  330. <p>The special <em class="replaceable"><code>method-name</code></em> ‘<code class="literal">*init*</code>’ can be used to name
  331. a non-default constructor (only if <em class="replaceable"><code>make-interface</code></em> discussed above
  332. is <code class="literal">#f</code>).
  333. It can be used to initialize a freshly-allocated instance
  334. using passed-in parameters.
  335. You can call a superclass or a sibling constructor using
  336. the <code class="literal">invoke-special</code> special function.
  337. (This is general but admittedly a bit verbose; a more compact
  338. form may be added in the future.)
  339. See the example below.
  340. </p>
  341. </section>
  342. <section class="sect2" title="Example" epub:type="division" id="idm139667871712176">
  343. <div class="titlepage">
  344. <div>
  345. <div>
  346. <h3 class="title">Example</h3>
  347. </div>
  348. </div>
  349. </div>
  350. <p>In the following example we define a simple class <code class="literal">2d-vector</code>
  351. and a class <code class="literal">3d-vector</code> that extends it. (This is for illustration
  352. only - defining 3-dimensional points as an extension
  353. of 2-dimensional points does not really make sense.)
  354. </p>
  355. <pre class="screen">(define-simple-class 2d-vector ()
  356. (x ::double init-keyword: x:)
  357. ;; Alternative type-specification syntax.
  358. (y type: double init-keyword: y:)
  359. (zero-2d :: 2d-vector allocation: 'static
  360. init-value: (2d-vector 0))
  361. ;; An object initializer (constructor) method.
  362. ((*init* (x0 ::double) (y0 ::double))
  363. (set! x x0)
  364. (set! y y0))
  365. ((*init* (xy0 ::double))
  366. ;; Call above 2-argument constructor.
  367. (invoke-special 2d-vector (this) '*init* xy0 xy0))
  368. ;; Need a default constructor as well.
  369. ((*init*) #!void)
  370. ((add (other ::2d-vector)) ::2d-vector
  371. ;; Kawa compiles this using primitive Java types!
  372. (2d-vector
  373. x: (+ x other:x)
  374. y: (+ y other:y)))
  375. ((scale (factor ::double)) ::2d-vector
  376. (2d-vector x: (* factor x) y: (* factor y))))
  377. (define-simple-class 3d-vector (2d-vector)
  378. (z type: double init-value: 0.0 init-keyword: z:)
  379. ;; A constructor which calls the superclass constructor.
  380. ((*init* (x0 ::double) (y0 ::double) (z0 ::double))
  381. (invoke-special 2d-vector (this) '*init* x0 y0)
  382. (set! z z0))
  383. ;; Need a default constructor.
  384. ((*init*) #!void)
  385. ((scale (factor ::double)) ::2d-vector
  386. ;; Note we cannot override the return type to 3d-vector
  387. ;; because Kawa doesn't yet support covariant return types.
  388. (3d-vector
  389. x: (* factor x)
  390. y: (* factor (this):y) ;; Alternative syntax.
  391. z: (* factor z))))
  392. </pre>
  393. <p>Note we define both explicit non-default constructor methods,
  394. and we associate fields with keywords, so they can be named
  395. when allocating an object. Using keywords requires a default constructor,
  396. and since having non-default constructors suppresses
  397. the implicit default constructor we have to explicitly define it.
  398. Using both styles of constructors is rather redundant, though.
  399. </p>
  400. </section>
  401. </section>
  402. <footer>
  403. <div class="navfooter">
  404. <ul>
  405. <li>
  406. <b class="toc">
  407. <a href="Defining-new-classes.xhtml#idm139667871849328">General class properties</a>
  408. </b>
  409. </li>
  410. <li>
  411. <b class="toc">
  412. <a href="Defining-new-classes.xhtml#idm139667871818992">Declaring fields</a>
  413. </b>
  414. </li>
  415. <li>
  416. <b class="toc">
  417. <a href="Defining-new-classes.xhtml#idm139667871763344">Declaring methods</a>
  418. </b>
  419. </li>
  420. <li>
  421. <b class="toc">
  422. <a href="Defining-new-classes.xhtml#idm139667871712176">Example</a>
  423. </b>
  424. </li>
  425. </ul>
  426. <p>
  427. Up: <a accesskey="u" href="Objects-Classes-and-Modules.xhtml">Object, Classes and Modules</a></p>
  428. <p>
  429. Next: <a accesskey="n" href="Anonymous-classes.xhtml">Anonymous classes</a></p>
  430. </div>
  431. </footer>
  432. </body>
  433. </html>