Vectors.xhtml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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>Vectors</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="Uniform-vectors.xhtml" title="Uniform vectors"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="Vectors" epub:type="subchapter" id="Vectors">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">Vectors</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p>Vectors are heterogeneous structures whose elements are indexed by
  23. integers. A vector typically occupies less space than a list of the
  24. same length, and the average time needed to access a randomly chosen
  25. element is typically less for the vector than for the list.
  26. </p>
  27. <p>The <span class="emphasis"><em>length</em></span> of a vector is the number of elements that it
  28. contains. This number is a non–negative integer that is fixed when the
  29. vector is created. The <span class="emphasis"><em>valid indices</em></span> of a vector are the exact
  30. non–negative integer objects less than the length of the vector. The
  31. first element in a vector is indexed by zero, and the last element is
  32. indexed by one less than the length of the vector.
  33. </p>
  34. <p>Vectors are written using the notation <code class="literal">#(<em class="replaceable"><code>obj</code></em> ...)</code>.
  35. For example, a vector of length 3 3 containing the number zero
  36. in element 0, the list <code class="literal">(2 2 2 2)</code> in element 1, and the
  37. string <code class="literal">"Anna"</code> in element 2 can be written as following:
  38. </p>
  39. <pre class="screen">#(0 (2 2 2 2) "Anna")
  40. </pre>
  41. <p>Note that this is the external representation of a vector.
  42. In Kawa, a vector datum is self-evaluating,
  43. but for style (and compatibility with R7RS) is is suggested
  44. you quote a vector constant:
  45. </p>
  46. <pre class="screen">’#(0 (2 2 2 2) "Anna") ⇒ #(0 (2 2 2 2) "Anna")
  47. </pre>
  48. <p>Compare these different ways of creating a vector:
  49. </p>
  50. <div class="variablelist" epub:type="list">
  51. <dl class="variablelist">
  52. <dt class="term"><code class="literal">(vector a b c)</code>
  53. </dt>
  54. <dd>
  55. <p>In this case <code class="literal">a</code>, <code class="literal">b</code>, and <code class="literal">c</code> are expressions evaluated at
  56. run-time and the results used to initialize a newly-allocated 3-element vector.
  57. </p>
  58. </dd>
  59. <dt class="term"><code class="literal">[a b c]</code>
  60. </dt>
  61. <dd>
  62. <p>Same as using vector, but more concise, and results in an immutable
  63. (non-modifiable) vector.
  64. </p>
  65. </dd>
  66. <dt class="term"><code class="literal">#(a b c)</code>
  67. </dt>
  68. <dd>
  69. <p>This is reader syntax and creates a vector literal,
  70. at read-time, early in compile-time.
  71. The symbols <code class="literal">a</code>, <code class="literal">b</code>, and <code class="literal">c</code> are not evaluated
  72. but instead used literally.
  73. </p>
  74. </dd>
  75. <dt class="term"><code class="literal">`#(,a ,b ,c)</code>
  76. </dt>
  77. <dd>
  78. <p>This is reader-syntax, using quasi-quotation,
  79. so <code class="literal">a</code>, <code class="literal">b</code>, and <code class="literal">c</code> are expressions evaluated at run-time.
  80. This is equivalent to <code class="literal">[a b c]</code> in that it results in an immutable vector.
  81. </p>
  82. </dd>
  83. </dl>
  84. </div>
  85. <p class="synopsis" kind="Type"><span class="kind">Type</span><span class="ignore">: </span><a id="idm139667874462704" class="indexterm"/> <code class="function">vector</code></p>
  86. <div class="blockquote">
  87. <blockquote class="blockquote">
  88. <p>The type of vector objects.
  89. </p>
  90. </blockquote>
  91. </div>
  92. <p class="synopsis" kind="Constructor"><span class="kind">Constructor</span><span class="ignore">: </span><a id="idm139667874459728" class="indexterm"/> <code class="function">vector</code> <em class="replaceable"><code><em class="replaceable"><code>obj</code></em></code></em> <em class="replaceable"><code>…</code></em></p>
  93. <div class="blockquote">
  94. <blockquote class="blockquote">
  95. <p>Return a newly allocated vector whose elements contain the given
  96. arguments. Analogous to <code class="literal">list</code>.
  97. </p>
  98. <pre class="screen">(vector 'a 'b 'c) ⇒ #(a b c)
  99. </pre>
  100. <p>Alternatively, you can use square-bracket syntax,
  101. which results in an immutable vector:
  102. </p>
  103. <pre class="screen">['a 'b 'c] ⇒ #(a b c)
  104. </pre>
  105. </blockquote>
  106. </div>
  107. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874454048" class="indexterm"/> <code class="function">make-vector</code> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em></p>
  108. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874451120" class="indexterm"/> <code class="function">make-vector</code> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>fill</code></em></code></em></p>
  109. <div class="blockquote">
  110. <blockquote class="blockquote">
  111. <p>Return a newly allocated vector of <em class="replaceable"><code>k</code></em> elements. If a second
  112. argument is given, then each element is initialized to <em class="replaceable"><code>fill</code></em>.
  113. Otherwise the initial contents of each element is <code class="literal">#!null</code>.
  114. </p>
  115. </blockquote>
  116. </div>
  117. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874445712" class="indexterm"/> <code class="function">vector?</code> <em class="replaceable"><code><em class="replaceable"><code>obj</code></em></code></em></p>
  118. <div class="blockquote">
  119. <blockquote class="blockquote">
  120. <p>Return <code class="literal">#t</code> if <em class="replaceable"><code>obj</code></em> is a vector, <code class="literal">#f</code> otherwise.
  121. </p>
  122. </blockquote>
  123. </div>
  124. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874440992" class="indexterm"/> <code class="function">vector-length</code> <em class="replaceable"><code><em class="replaceable"><code>vector</code></em></code></em></p>
  125. <div class="blockquote">
  126. <blockquote class="blockquote">
  127. <p>Return the number of elements in <em class="replaceable"><code>vector</code></em> as an exact integer.
  128. </p>
  129. </blockquote>
  130. </div>
  131. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874436896" class="indexterm"/> <code class="function">vector-ref</code> <em class="replaceable"><code><em class="replaceable"><code>vector</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em></p>
  132. <div class="blockquote">
  133. <blockquote class="blockquote">
  134. <p>It is an error if <em class="replaceable"><code>k</code></em> is not a valid index of <em class="replaceable"><code>vector</code></em>.
  135. The <code class="literal">vector-ref</code>
  136. procedure returns the contents of element <em class="replaceable"><code>k</code></em> of <em class="replaceable"><code>vector</code></em>.
  137. </p>
  138. <pre class="screen">(vector-ref '#(1 1 2 3 5 8 13 21) 5) ⇒ 8
  139. (vector-ref '#(1 1 2 3 5 8 13 21)
  140. (inexact-&gt;exact (round (* 2 (acos -1)))))
  141. ⇒ 13
  142. </pre>
  143. </blockquote>
  144. </div>
  145. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874430016" class="indexterm"/> <code class="function">vector-set!</code> <em class="replaceable"><code><em class="replaceable"><code>vector</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>obj</code></em></code></em></p>
  146. <div class="blockquote">
  147. <blockquote class="blockquote">
  148. <p>It is an error if <em class="replaceable"><code>k</code></em> is not a valid index of <em class="replaceable"><code>vector</code></em>.
  149. The <code class="literal">vector-set!</code>
  150. procedure stores <em class="replaceable"><code>obj</code></em> in element <em class="replaceable"><code>k</code></em> of <em class="replaceable"><code>vector</code></em>, and
  151. returns no values.
  152. </p>
  153. <pre class="screen">(let ((vec (vector 0 '(2 2 2 2) "Anna")))
  154. (vector-set! vec 1 '("Sue" "Sue"))
  155. vec)
  156. ⇒ #(0 ("Sue" "Sue") "Anna")
  157. (vector-set! '#(0 1 2) 1 "doe")
  158. ⇒ <span class="emphasis"><em>error</em></span> ;; constant vector
  159. </pre>
  160. </blockquote>
  161. </div>
  162. <p>A concise alternative to <code class="literal">vector-ref</code> and <code class="literal">vector-set!</code>
  163. is to use function call syntax. For example:
  164. </p>
  165. <pre class="screen">(let ((vec (vector 0 '(2 2 2 2) "Anna")))
  166. (set! (vec 1) '("Sue" "Sue"))
  167. (list (vec 2) (vec 1)))
  168. ⇒ ("Anna" ("Sue" "Sue"))
  169. </pre>
  170. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874419904" class="indexterm"/> <code class="function">vector-&gt;list</code> <em class="replaceable"><code><em class="replaceable"><code>vector</code></em></code></em> [<em class="replaceable"><code><em class="replaceable"><code>start</code></em></code></em> [<em class="replaceable"><code><em class="replaceable"><code>end</code></em></code></em>]]</p>
  171. <div class="blockquote">
  172. <blockquote class="blockquote">
  173. <p>The <code class="literal">vector-&gt;list</code> procedure returns a newly allocated list of the
  174. objects contained in the elements of <em class="replaceable"><code>vector</code></em>
  175. between <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>.
  176. </p>
  177. <pre class="screen">(vector-&gt;list '#(dah dah didah)) ⇒ (dah dah didah)
  178. (vector-&gt;list '#(dah dah didah) 1 2) ⇒ (dah)
  179. </pre>
  180. </blockquote>
  181. </div>
  182. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874412816" class="indexterm"/> <code class="function">list-&gt;vector</code> <em class="replaceable"><code><em class="replaceable"><code>list</code></em></code></em></p>
  183. <div class="blockquote">
  184. <blockquote class="blockquote">
  185. <p>The <code class="literal">list-&gt;vector</code> procedure returns a newly created vector
  186. initialized to the elements of the list <em class="replaceable"><code>list</code></em>, in order.
  187. </p>
  188. <pre class="screen">(list-&gt;vector '(dididit dah)) ⇒ #(dididit dah)
  189. </pre>
  190. </blockquote>
  191. </div>
  192. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874407984" class="indexterm"/> <code class="function">vector-copy</code> <em class="replaceable"><code>vector</code></em> [<em class="replaceable"><code>start</code></em> [<em class="replaceable"><code>end</code></em>]]</p>
  193. <div class="blockquote">
  194. <blockquote class="blockquote">
  195. <p>Returns a newly allocated copy of the elements of the given
  196. <em class="replaceable"><code>vector</code></em> between <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em> . The elements of the new
  197. vector are the same (in the sense of <code class="literal">eqv?</code>) as the elements
  198. of the old.
  199. </p>
  200. <pre class="screen">(define a #(1 8 2 8)) ; a may be immutable
  201. (define b (vector-copy a))
  202. (vector-set! b 0 3) ; b is mutable
  203. b ⇒ #(3 8 2 8)
  204. (define c (vector-copy b 1 3))
  205. c ⇒ #(8 2)
  206. </pre>
  207. </blockquote>
  208. </div>
  209. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874401136" class="indexterm"/> <code class="function">vector-copy!</code> <em class="replaceable"><code>to</code></em> <em class="replaceable"><code>at</code></em> <em class="replaceable"><code>from</code></em> [<em class="replaceable"><code>start</code></em> [<em class="replaceable"><code>end</code></em>]]</p>
  210. <div class="blockquote">
  211. <blockquote class="blockquote">
  212. <p>Copies the elements of vector from between start and end
  213. to vector to, starting at at. The order in which elements
  214. are copied is unspecified, except that if the source and
  215. destination overlap, copying takes place as if the source is first
  216. copied into a temporary vector and then into the destination.
  217. This can be achieved without allocating storage by making
  218. sure to copy in the correct direction in such circumstances.
  219. </p>
  220. <p>It is an error if <em class="replaceable"><code>at</code></em> is less than zero or greater than the length
  221. of <em class="replaceable"><code>to</code></em>.
  222. It is also an error if <code class="literal">(- (vector-length <em class="replaceable"><code>to</code></em>) <em class="replaceable"><code>at</code></em>)</code> is less
  223. than <code class="literal">(- <em class="replaceable"><code>end</code></em> <em class="replaceable"><code>start</code></em>)</code>.
  224. </p>
  225. <pre class="screen">(define a (vector 1 2 3 4 5))
  226. (define b (vector 10 20 30 40 50))
  227. (vector-copy! b 1 a 0 2)
  228. b ⇒ #(10 1 2 40 50)
  229. </pre>
  230. </blockquote>
  231. </div>
  232. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874391376" class="indexterm"/> <code class="function">vector-append</code> <em class="replaceable"><code><em class="replaceable"><code>arg</code></em></code></em><em class="replaceable"><code>...</code></em></p>
  233. <div class="blockquote">
  234. <blockquote class="blockquote">
  235. <p>Creates a newly allocated vector whose elements are the
  236. concatenation of the elements of the given arguments.
  237. Each <em class="replaceable"><code>arg</code></em> may be a vector or a list.
  238. </p>
  239. <pre class="screen">(vector-append #(a b c) #(d e f))
  240. ⇒ #(a b c d e f)
  241. </pre>
  242. </blockquote>
  243. </div>
  244. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874386768" class="indexterm"/> <code class="function">vector-fill!</code> <em class="replaceable"><code><em class="replaceable"><code>vector fill</code></em></code></em> [<em class="replaceable"><code><em class="replaceable"><code>start</code></em></code></em> [<em class="replaceable"><code><em class="replaceable"><code>end</code></em></code></em>]]</p>
  245. <div class="blockquote">
  246. <blockquote class="blockquote">
  247. <p>Stores <em class="replaceable"><code>fill</code></em> in in the elements of <em class="replaceable"><code>vector</code></em>
  248. between <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>.
  249. </p>
  250. <pre class="screen">(define a (vector 1 2 3 4 5))
  251. (vector-fill! a 'smash 2 4)
  252. a ⇒ #(1 2 smash smash 5)
  253. </pre>
  254. </blockquote>
  255. </div>
  256. <p>The procedures <code class="literal">vector-map</code> and <code class="literal">vector-for-each</code>
  257. are documented in <a class="link" href="Mapping-functions.xhtml" title="Mapping functions">Mapping functions</a>.
  258. </p>
  259. </section>
  260. <footer>
  261. <div class="navfooter">
  262. <p>
  263. Up: <a accesskey="u" href="Data-structures.xhtml">Data structures</a></p>
  264. <p>
  265. Previous: <a accesskey="p" href="Lists.xhtml">Lists</a></p>
  266. <p>
  267. Next: <a accesskey="n" href="Uniform-vectors.xhtml">Uniform vectors</a></p>
  268. </div>
  269. </footer>
  270. </body>
  271. </html>