Strings.xhtml 123 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614
  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>Strings</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="String-literals.xhtml" title="String literals"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="Strings" epub:type="subchapter" id="Strings">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">Strings</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p>Strings are sequences of characters. The <span class="emphasis"><em>length</em></span> of a string is
  23. the number of characters that it contains, as an exact non-negative integer.
  24. The <span class="emphasis"><em>valid indices</em></span> of a string are the
  25. exact non-negative integers less than the length of the string.
  26. The first character of a
  27. string has index 0, the second has index 1, and so on.
  28. </p>
  29. <p>Strings are <span class="emphasis"><em>implemented</em></span> as a sequence of 16-bit <code class="literal">char</code> values,
  30. even though they’re semantically a sequence of 32-bit Unicode code points.
  31. A character whose value is greater than <code class="literal">#xffff</code>
  32. is represented using two surrogate characters.
  33. The implementation allows for natural interoperability with Java APIs.
  34. However it does make certain operations (indexing or counting based on
  35. character counts) difficult to implement efficiently. Luckily one
  36. rarely needs to index or count based on character counts;
  37. alternatives are discussed below.
  38. </p>
  39. <a id="idm139667875784160" class="indexterm"/>
  40. <a id="idm139667875783376" class="indexterm"/>
  41. <p>There are different kinds of strings:
  42. </p>
  43. <div class="itemizedlist" epub:type="list">
  44. <ul class="itemizedlist" style="list-style-type: disc; ">
  45. <li class="listitem" epub:type="list-item">
  46. <p>An <em class="firstterm">istring</em> is <span class="emphasis"><em>immutable</em></span>:
  47. It is fixed, and cannot be modified.
  48. On the other hand, indexing (e.g. <code class="literal">string-ref</code>) is efficient (constant-time),
  49. while indexing of other string implementations takes time proportional
  50. to the index.
  51. </p>
  52. <p>String literals are istrings, as are the return values of
  53. most of the procedures in this chapter.
  54. </p>
  55. <p>An <em class="firstterm">istring</em> is an instance of the <code class="literal">gnu.lists.IString</code> class.
  56. </p>
  57. </li>
  58. <li class="listitem" epub:type="list-item">
  59. <p>An <em class="firstterm">mstring</em> is <span class="emphasis"><em>mutable</em></span>:
  60. You can replace individual characters (using <code class="literal">string-set!</code>).
  61. You can also change the <em class="replaceable"><code>mstring</code></em>’s length by inserting
  62. or removing characters (using <code class="literal">string-append!</code> or <code class="literal">string-replace!</code>).
  63. </p>
  64. <p>An <em class="firstterm">mstring</em> is an instance of the <code class="literal">gnu.lists.FString</code> class.
  65. </p>
  66. </li>
  67. <li class="listitem" epub:type="list-item">
  68. <p>Any other object that implements the <code class="literal">java.lang.CharSequence</code> interface
  69. is also a string.
  70. This includes standard Java <code class="literal">java.lang.String</code>
  71. and <code class="literal">java.lang.StringBuilder</code> objects.
  72. </p>
  73. </li>
  74. </ul>
  75. </div>
  76. <p>Some of the procedures that operate on strings ignore the
  77. difference between upper and lower case. The names of
  78. the versions that ignore case end with “<code class="literal">-ci</code>” (for “case
  79. insensitive”).
  80. </p>
  81. <p><span class="emphasis"><em>Compatibility:</em></span>
  82. Many of the following procedures (for example <code class="literal">string-append</code>)
  83. return an immutable istring in Kawa,
  84. but return a “freshly allocated” mutable string in
  85. standard Scheme (include R7RS) as well as most Scheme implementations
  86. (including previous versions of Kawa).
  87. To get the “compatibility mode” versions of those procedures
  88. (which return mstrings),
  89. invoke Kawa with one the <code class="literal">--r5rs</code>, <code class="literal">--r6rs</code>, or <code class="literal">--r7rs</code>
  90. options, or you can <code class="literal">import</code> a standard library like <code class="literal">(scheme base)</code>.
  91. </p>
  92. <p class="synopsis" kind="Type"><span class="kind">Type</span><span class="ignore">: </span><a id="idm139667875766704" class="indexterm"/> <code class="function">string</code></p>
  93. <div class="blockquote">
  94. <blockquote class="blockquote">
  95. <p>The type of string objects.
  96. The underlying type is the interface <code class="literal">java.lang.CharSequence</code>.
  97. Immultable strings are <code class="literal">gnu.lists.IString</code> or <code class="literal">java.lang.String</code>,
  98. while mutable strings are <code class="literal">gnu.lists.FString</code>.
  99. </p>
  100. </blockquote>
  101. </div>
  102. <section class="sect2" title="Basic string procedures" epub:type="division" id="idm139667875762032">
  103. <div class="titlepage">
  104. <div>
  105. <div>
  106. <h3 class="title">Basic string procedures</h3>
  107. </div>
  108. </div>
  109. </div>
  110. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875760960" class="indexterm"/> <code class="function">string?</code> <em class="replaceable"><code><em class="replaceable"><code>obj</code></em></code></em></p>
  111. <div class="blockquote">
  112. <blockquote class="blockquote">
  113. <p>Return <code class="literal">#t</code> if <em class="replaceable"><code>obj</code></em> is a string, <code class="literal">#f</code> otherwise.
  114. </p>
  115. </blockquote>
  116. </div>
  117. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875756240" class="indexterm"/> <code class="function">istring?</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 istring (a immutable, constant-time-indexable string); <code class="literal">#f</code> otherwise.
  121. </p>
  122. </blockquote>
  123. </div>
  124. <p class="synopsis" kind="Constructor"><span class="kind">Constructor</span><span class="ignore">: </span><a id="idm139667875751472" class="indexterm"/> <code class="function">string</code> <em class="replaceable"><code><em class="replaceable"><code>char</code></em></code></em> <em class="replaceable"><code>…</code></em></p>
  125. <div class="blockquote">
  126. <blockquote class="blockquote">
  127. <p>Return a string composed of the arguments.
  128. This is analogous to <em class="replaceable"><code>list</code></em>.
  129. </p>
  130. <p><span class="emphasis"><em>Compatibility:</em></span> The result is an istring,
  131. except in compatibility mode, when it is a new allocated mstring.
  132. </p>
  133. </blockquote>
  134. </div>
  135. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875746304" class="indexterm"/> <code class="function">string-length</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  136. <div class="blockquote">
  137. <blockquote class="blockquote">
  138. <p>Return the number of characters in the given <em class="replaceable"><code>string</code></em> as an exact
  139. integer object.
  140. </p>
  141. <p><span class="emphasis"><em>Performance note:</em></span> If the <em class="replaceable"><code>string</code></em> is not an istring,
  142. the calling <code class="literal">string-length</code> may take time proportional
  143. to the length of the <em class="replaceable"><code>string</code></em>,
  144. because of the need to scan for surrogate pairs.
  145. </p>
  146. </blockquote>
  147. </div>
  148. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875740176" class="indexterm"/> <code class="function">string-ref</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em></p>
  149. <div class="blockquote">
  150. <blockquote class="blockquote">
  151. <p><em class="replaceable"><code>k</code></em> must be a valid index of <em class="replaceable"><code>string</code></em>. The <code class="literal">string-ref</code>
  152. procedure returns character <em class="replaceable"><code>k</code></em> of <em class="replaceable"><code>string</code></em> using zero–origin
  153. indexing.
  154. </p>
  155. <p><span class="emphasis"><em>Performance note:</em></span> If the <em class="replaceable"><code>string</code></em> is not an istring,
  156. then calling <code class="literal">string-ref</code> may take time proportional
  157. to <em class="replaceable"><code>k</code></em> because of the need to check for surrogate pairs.
  158. An alternative is to use <code class="literal">string-cursor-ref</code>.
  159. If iterating through a string, use <code class="literal">string-for-each</code>.
  160. </p>
  161. </blockquote>
  162. </div>
  163. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875731040" class="indexterm"/> <code class="function">string-null?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  164. <div class="blockquote">
  165. <blockquote class="blockquote">
  166. <p>Is <em class="replaceable"><code>string</code></em> the empty string?
  167. Same result as <code class="literal">(= (string-length <em class="replaceable"><code>string</code></em>) 0)</code> but
  168. executes in O(1) time.
  169. </p>
  170. </blockquote>
  171. </div>
  172. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875726144" class="indexterm"/> <code class="function">string-every</code> <em class="replaceable"><code>pred</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>])</p>
  173. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875721968" class="indexterm"/> <code class="function">string-any</code> <em class="replaceable"><code>pred</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>])</p>
  174. <div class="blockquote">
  175. <blockquote class="blockquote">
  176. <p>Checks to see if every/any character in <em class="replaceable"><code>string</code></em> satisfies <em class="replaceable"><code>pred</code></em>,
  177. proceeding from left (index <em class="replaceable"><code>start</code></em>) to right (index <em class="replaceable"><code>end</code></em>). These
  178. procedures are short-circuiting: if <em class="replaceable"><code>pred</code></em> returns false,
  179. <code class="literal">string-every</code> does not call <em class="replaceable"><code>pred</code></em> on subsequent characters;
  180. if <em class="replaceable"><code>pred</code></em> returns true, <code class="literal">string-any</code> does not call <em class="replaceable"><code>pred</code></em>
  181. on subsequent characters. Both procedures are “witness-generating”:
  182. </p>
  183. <div class="itemizedlist" epub:type="list">
  184. <ul style="list-style-type: disc; " class="itemizedlist">
  185. <li class="listitem" epub:type="list-item">
  186. <p>If <code class="literal">string-every</code> is given an empty interval (with <em class="replaceable"><code>start</code></em> = <em class="replaceable"><code>end</code></em>),
  187. it returns <code class="literal">#t</code>.
  188. </p>
  189. </li>
  190. <li class="listitem" epub:type="list-item">
  191. <p>If <code class="literal">string-every</code> returns true for a non-empty interval
  192. (with <em class="replaceable"><code>start</code></em> &lt; <em class="replaceable"><code>end</code></em>), the returned true value is the one returned by the final call to the predicate on
  193. <code class="literal">(string-ref <em class="replaceable"><code>string</code></em> (- <em class="replaceable"><code>end</code></em> 1))</code>.
  194. </p>
  195. </li>
  196. <li class="listitem" epub:type="list-item">
  197. <p>If <code class="literal">string-any</code> returns true, the returned true value is the one
  198. returned by the predicate.
  199. </p>
  200. </li>
  201. </ul>
  202. </div>
  203. <p><span class="emphasis"><em>Note:</em></span> The names of these procedures do not end with a question
  204. mark. This indicates a general value is returned instead of a simple
  205. boolean (<code class="literal">#t</code> or <code class="literal">#f</code>).
  206. </p>
  207. </blockquote>
  208. </div>
  209. </section>
  210. <section class="sect2" title="Immutable String Constructors" epub:type="division" id="idm139667875704704">
  211. <div class="titlepage">
  212. <div>
  213. <div>
  214. <h3 class="title">Immutable String Constructors</h3>
  215. </div>
  216. </div>
  217. </div>
  218. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875703616" class="indexterm"/> <code class="function">string-tabulate</code> <em class="replaceable"><code>proc</code></em> <em class="replaceable"><code>len</code></em></p>
  219. <div class="blockquote">
  220. <blockquote class="blockquote">
  221. <p>Constructs a string of size <em class="replaceable"><code>len</code></em> by calling <em class="replaceable"><code>proc</code></em> on
  222. each value from 0 (inclusive) to <em class="replaceable"><code>len</code></em> (exclusive) to produce
  223. the corresponding element of the string.
  224. The procedure <em class="replaceable"><code>proc</code></em> accepts an exact integer as its argument and returns a character.
  225. The order in which <em class="replaceable"><code>proc</code></em> is called on those indexes is not specifified.
  226. </p>
  227. <p><span class="emphasis"><em>Rationale:</em></span> Although <code class="literal">string-unfold</code> is more general,
  228. <code class="literal">string-tabulate</code> is likely to run faster for the common special
  229. case it implements.
  230. </p>
  231. </blockquote>
  232. </div>
  233. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875695664" class="indexterm"/> <code class="function">string-unfold</code> <em class="replaceable"><code>stop?</code></em> <em class="replaceable"><code>mapper</code></em> <em class="replaceable"><code>successor</code></em> <em class="replaceable"><code>seed</code></em> [<em class="replaceable"><code>base</code></em> <em class="replaceable"><code>make-final</code></em>]</p>
  234. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875690624" class="indexterm"/> <code class="function">string-unfold-right</code> <em class="replaceable"><code>stop?</code></em> <em class="replaceable"><code>mapper</code></em> <em class="replaceable"><code>successor</code></em> <em class="replaceable"><code>seed</code></em> [<em class="replaceable"><code>base</code></em> <em class="replaceable"><code>make-final</code></em>]</p>
  235. <div class="blockquote">
  236. <blockquote class="blockquote">
  237. <p>This is a fundamental and powerful constructor for strings.
  238. </p>
  239. <div class="itemizedlist" epub:type="list">
  240. <ul style="list-style-type: disc; " class="itemizedlist">
  241. <li class="listitem" epub:type="list-item">
  242. <p><em class="replaceable"><code>successor</code></em> is used to generate a series of “seed” values from the initial seed:
  243. <em class="replaceable"><code>seed</code></em>, <code class="literal">(</code><em class="replaceable"><code>successor</code></em> <em class="replaceable"><code>seed</code></em><code class="literal">)</code>, <code class="literal">(</code><em class="replaceable"><code>successor</code></em><sup>2</sup> <em class="replaceable"><code>seed</code></em><code class="literal">)</code>, <code class="literal">(</code><em class="replaceable"><code>successor</code></em><sup>3</sup> <em class="replaceable"><code>seed</code></em><code class="literal">)</code>, ...
  244. </p>
  245. </li>
  246. <li class="listitem" epub:type="list-item">
  247. <p><em class="replaceable"><code>stop?</code></em> tells us when to stop — when it returns true when applied to one of these seed values.
  248. </p>
  249. </li>
  250. <li class="listitem" epub:type="list-item">
  251. <p><em class="replaceable"><code>mapper</code></em> maps each seed value to the corresponding character(s) in the result string, which are assembled into that string in left-to-right order. It is an error for <em class="replaceable"><code>mapper</code></em> to return anything other than a character or string.
  252. </p>
  253. </li>
  254. <li class="listitem" epub:type="list-item">
  255. <p><em class="replaceable"><code>base</code></em> is the optional initial/leftmost portion of the constructed string, which defaults to the empty string <code class="literal">""</code>.
  256. It is an error if <em class="replaceable"><code>base</code></em> is anything other than a character or string.
  257. </p>
  258. </li>
  259. <li class="listitem" epub:type="list-item">
  260. <p><em class="replaceable"><code>make-final</code></em> is applied to the terminal seed value (on which <em class="replaceable"><code>stop?</code></em> returns true) to produce the final/rightmost portion of the constructed string. It defaults to <code class="literal">(lambda (x) "")</code>.
  261. It is an error for <em class="replaceable"><code>make-final</code></em> to return anything other than
  262. a character or string.
  263. </p>
  264. </li>
  265. </ul>
  266. </div>
  267. <p><code class="literal">string-unfold-right</code> is the same as <code class="literal">string-unfold</code> except the
  268. results of <em class="replaceable"><code>mapper</code></em> are assembled into the string in right-to-left order,
  269. <em class="replaceable"><code>base</code></em> is the optional rightmost portion of the constructed string, and
  270. <em class="replaceable"><code>make-final</code></em> produces the leftmost portion of the constructed string.
  271. </p>
  272. <p>You can use it <code class="literal">string-unfold</code> to convert a list to a string,
  273. read a port into a string, reverse a string, copy a string, and so forth.
  274. Examples:
  275. </p>
  276. <pre class="screen">(define (port-&gt;string p)
  277. (string-unfold eof-object? values
  278. (lambda (x) (read-char p))
  279. (read-char p)))
  280. (define (list-&gt;string lis)
  281. (string-unfold null? car cdr lis))
  282. (define (string-tabulate f size)
  283. (string-unfold (lambda (i) (= i size)) f add1 0))
  284. </pre>
  285. <p>To map <em class="replaceable"><code>f</code></em> over a list <em class="replaceable"><code>lis</code></em>, producing a string:
  286. </p>
  287. <pre class="screen">(string-unfold null? (compose <em class="replaceable"><code>f</code></em> car) cdr <em class="replaceable"><code>lis</code></em>)
  288. </pre>
  289. <p>Interested functional programmers may enjoy noting that <code class="literal">string-fold-right</code>
  290. and <code class="literal">string-unfold</code> are in some sense inverses.
  291. That is, given operations <em class="replaceable"><code>knull?</code></em>, <em class="replaceable"><code>kar</code></em>, <em class="replaceable"><code>kdr</code></em>,
  292. <em class="replaceable"><code>kons</code></em>, and <em class="replaceable"><code>knil</code></em> satisfying
  293. </p>
  294. <pre class="screen">(<em class="replaceable"><code>kons</code></em> (<em class="replaceable"><code>kar</code></em> x) (<em class="replaceable"><code>kdr</code></em> x)) = x and (<em class="replaceable"><code>knull?</code></em> <em class="replaceable"><code>knil</code></em>) = #t
  295. </pre>
  296. <p>then
  297. </p>
  298. <pre class="screen">(string-fold-right <em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>knil</code></em> (string-unfold <em class="replaceable"><code>knull?</code></em> <em class="replaceable"><code>kar</code></em> <em class="replaceable"><code>kdr</code></em> <em class="replaceable"><code>x</code></em>)) = <em class="replaceable"><code>x</code></em>
  299. </pre>
  300. <p>and
  301. </p>
  302. <pre class="screen">(string-unfold <em class="replaceable"><code>knull?</code></em> <em class="replaceable"><code>kar</code></em> <em class="replaceable"><code>kdr</code></em> (string-fold-right <em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>knil</code></em> <em class="replaceable"><code>string</code></em>)) = <em class="replaceable"><code>string</code></em>.
  303. </pre>
  304. <p>This combinator pattern is sometimes called an “anamorphism.”
  305. </p>
  306. </blockquote>
  307. </div>
  308. </section>
  309. <section class="sect2" title="Selection" epub:type="division" id="idm139667875652960">
  310. <div class="titlepage">
  311. <div>
  312. <div>
  313. <h3 class="title">Selection</h3>
  314. </div>
  315. </div>
  316. </div>
  317. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875651888" class="indexterm"/> <code class="function">substring</code> <em class="replaceable"><code><em class="replaceable"><code>string</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>
  318. <div class="blockquote">
  319. <blockquote class="blockquote">
  320. <p><em class="replaceable"><code>string</code></em> must be a string, and <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em> must be
  321. exact integer objects satisfying:
  322. </p>
  323. <pre class="screen">0 &lt;= <em class="replaceable"><code>start</code></em> &lt;= <em class="replaceable"><code>end</code></em> &lt;= (string-length <em class="replaceable"><code>string</code></em>)
  324. </pre>
  325. <p>The <code class="literal">substring</code> procedure returns a newly allocated string formed
  326. from the characters of <em class="replaceable"><code>string</code></em> beginning with index <em class="replaceable"><code>start</code></em>
  327. (inclusive) and ending with index <em class="replaceable"><code>end</code></em> (exclusive).
  328. </p>
  329. </blockquote>
  330. </div>
  331. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875642160" class="indexterm"/> <code class="function">string-take</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>nchars</code></em></p>
  332. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875638912" class="indexterm"/> <code class="function">string-drop</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>nchars</code></em></p>
  333. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875635664" class="indexterm"/> <code class="function">string-take-right</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>nchars</code></em></p>
  334. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875632416" class="indexterm"/> <code class="function">string-drop-right</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>nchars</code></em></p>
  335. <div class="blockquote">
  336. <blockquote class="blockquote">
  337. <p><code class="literal">string-take</code> returns an immutable string containing the
  338. first <em class="replaceable"><code>nchars</code></em> of <em class="replaceable"><code>string</code></em>;
  339. <code class="literal">string-drop</code> returns a string containing all but the first <em class="replaceable"><code>nchars</code></em>
  340. of <em class="replaceable"><code>string</code></em>.
  341. <code class="literal">string-take-right</code> returns a string containing the last <em class="replaceable"><code>nchars</code></em>
  342. of <em class="replaceable"><code>string</code></em>; <code class="literal">string-drop-right</code> returns a string containing all
  343. but the last <em class="replaceable"><code>nchars</code></em> of <em class="replaceable"><code>string</code></em>.
  344. </p>
  345. <pre class="screen">(string-take "Pete Szilagyi" 6) ⇒ "Pete S"
  346. (string-drop "Pete Szilagyi" 6) ⇒ "zilagyi"
  347. (string-take-right "Beta rules" 5) ⇒ "rules"
  348. (string-drop-right "Beta rules" 5) ⇒ "Beta "
  349. </pre>
  350. <p>It is an error to take or drop more characters than are in the string:
  351. </p>
  352. <pre class="screen">(string-take "foo" 37) ⇒ <span class="emphasis"><em>error</em></span>
  353. </pre>
  354. </blockquote>
  355. </div>
  356. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875621632" class="indexterm"/> <code class="function">string-pad</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>len</code></em> [<em class="replaceable"><code>char</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  357. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875617072" class="indexterm"/> <code class="function">string-pad-right</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>len</code></em> [<em class="replaceable"><code>char</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  358. <div class="blockquote">
  359. <blockquote class="blockquote">
  360. <p>Returns an istring of length <em class="replaceable"><code>len</code></em> comprised of the characters
  361. drawn from the given subrange of <em class="replaceable"><code>string</code></em>,
  362. padded on the left (right) by as many occurrences of the
  363. character <em class="replaceable"><code>char</code></em> as needed.
  364. If <em class="replaceable"><code>string</code></em> has more than <em class="replaceable"><code>len</code></em> chars, it is truncated on the
  365. left (right) to length <em class="replaceable"><code>len</code></em>.
  366. The <em class="replaceable"><code>char</code></em> defaults to <code class="literal">#\space</code>
  367. </p>
  368. <pre class="screen">(string-pad "325" 5) ⇒ " 325"
  369. (string-pad "71325" 5) ⇒ "71325"
  370. (string-pad "8871325" 5) ⇒ "71325"
  371. </pre>
  372. </blockquote>
  373. </div>
  374. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875607920" class="indexterm"/> <code class="function">string-trim</code> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>pred</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  375. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875603744" class="indexterm"/> <code class="function">string-trim-right</code> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>pred</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  376. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875599568" class="indexterm"/> <code class="function">string-trim-both</code> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>pred</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  377. <div class="blockquote">
  378. <blockquote class="blockquote">
  379. <p>Returns an istring obtained from the given subrange of <em class="replaceable"><code>string</code></em>
  380. by skipping over all characters on the left / on the right / on both sides that satisfy the second argument <em class="replaceable"><code>pred</code></em>:
  381. <em class="replaceable"><code>pred</code></em> defaults to <code class="literal">char-whitespace?</code>.
  382. </p>
  383. <pre class="screen">(string-trim-both " The outlook wasn't brilliant, \n\r")
  384. ⇒ "The outlook wasn't brilliant,"
  385. </pre>
  386. </blockquote>
  387. </div>
  388. </section>
  389. <section class="sect2" title="String Comparisons" epub:type="division" id="idm139667875592560">
  390. <div class="titlepage">
  391. <div>
  392. <div>
  393. <h3 class="title">String Comparisons</h3>
  394. </div>
  395. </div>
  396. </div>
  397. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875591488" class="indexterm"/> <code class="function">string=?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  398. <div class="blockquote">
  399. <blockquote class="blockquote">
  400. <p>Return <code class="literal">#t</code> if the strings are the same length and contain the same
  401. characters in the same positions. Otherwise, the <code class="literal">string=?</code>
  402. procedure returns <code class="literal">#f</code>.
  403. </p>
  404. <pre class="screen">(string=? "Straße" "Strasse") ⇒ #f
  405. </pre>
  406. </blockquote>
  407. </div>
  408. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875583520" class="indexterm"/> <code class="function">string&lt;?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  409. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875577904" class="indexterm"/> <code class="function">string&gt;?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  410. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875572288" class="indexterm"/> <code class="function">string&lt;=?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  411. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875566672" class="indexterm"/> <code class="function">string&gt;=?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  412. <div class="blockquote">
  413. <blockquote class="blockquote">
  414. <p>These procedures return <code class="literal">#t</code> if their arguments are (respectively):
  415. monotonically increasing, monotonically decreasing,
  416. monotonically non-decreasing, or monotonically nonincreasing.
  417. These predicates are required to be transitive.
  418. </p>
  419. <p>These procedures are the lexicographic extensions to strings of the
  420. corresponding orderings on characters. For example, <code class="literal">string&lt;?</code> is
  421. the lexicographic ordering on strings induced by the ordering
  422. <code class="literal">char&lt;?</code> on characters. If two strings differ in length but are
  423. the same up to the length of the shorter string, the shorter string is
  424. considered to be lexicographically less than the longer string.
  425. </p>
  426. <pre class="screen">(string&lt;? "z" "ß") ⇒ #t
  427. (string&lt;? "z" "zz") ⇒ #t
  428. (string&lt;? "z" "Z") ⇒ #f
  429. </pre>
  430. </blockquote>
  431. </div>
  432. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875557744" class="indexterm"/> <code class="function">string-ci=?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  433. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875552128" class="indexterm"/> <code class="function">string-ci&lt;?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  434. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875546512" class="indexterm"/> <code class="function">string-ci&gt;?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  435. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875540896" class="indexterm"/> <code class="function">string-ci&lt;=?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  436. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875535280" class="indexterm"/> <code class="function">string-ci&gt;=?</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>3</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  437. <div class="blockquote">
  438. <blockquote class="blockquote">
  439. <p>These procedures are similar to <code class="literal">string=?</code>, etc.,
  440. but behave as if they applied <code class="literal">string-foldcase</code> to their arguments
  441. before invoking the corresponding procedures without <code class="literal">-ci</code>.
  442. </p>
  443. <pre class="screen">(string-ci&lt;? "z" "Z") ⇒ #f
  444. (string-ci=? "z" "Z") ⇒ #t
  445. (string-ci=? "Straße" "Strasse") ⇒ #t
  446. (string-ci=? "Straße" "STRASSE") ⇒ #t
  447. (string-ci=? "ΧΑΟΣ" "χαοσ") ⇒ #t
  448. </pre>
  449. </blockquote>
  450. </div>
  451. </section>
  452. <section class="sect2" title="Conversions" epub:type="division" id="idm139667875526960">
  453. <div class="titlepage">
  454. <div>
  455. <div>
  456. <h3 class="title">Conversions</h3>
  457. </div>
  458. </div>
  459. </div>
  460. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875525888" class="indexterm"/> <code class="function">list-&gt;string</code> <em class="replaceable"><code><em class="replaceable"><code>list</code></em></code></em></p>
  461. <div class="blockquote">
  462. <blockquote class="blockquote">
  463. <p>The <code class="literal">list-&gt;string</code> procedure returns an istring
  464. formed from the characters in <em class="replaceable"><code>list</code></em>, in order.
  465. It is an error if any element of <em class="replaceable"><code>list</code></em> is not a character.
  466. </p>
  467. <p><span class="emphasis"><em>Compatibility:</em></span> The result is an istring,
  468. except in compatibility mode, when it is an mstring.
  469. </p>
  470. </blockquote>
  471. </div>
  472. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875520192" class="indexterm"/> <code class="function">reverse-list-&gt;string</code> <em class="replaceable"><code><em class="replaceable"><code>list</code></em></code></em></p>
  473. <div class="blockquote">
  474. <blockquote class="blockquote">
  475. <p>An efficient implementation of <code class="literal">(compose list-&gt;text reverse)</code>:
  476. </p>
  477. <pre class="screen">(reverse-list-&gt;text '(#\a #\B #\c)) ⇒ "cBa"
  478. </pre>
  479. <p>This is a common idiom in the epilogue of string-processing loops
  480. that accumulate their result using a list in reverse order.
  481. (See also <code class="literal">string-concatenate-reverse</code> for the “chunked” variant.)
  482. </p>
  483. </blockquote>
  484. </div>
  485. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875514880" class="indexterm"/> <code class="function">string-&gt;list</code> <em class="replaceable"><code><em class="replaceable"><code>string</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>
  486. <div class="blockquote">
  487. <blockquote class="blockquote">
  488. <p>The <code class="literal">string-&gt;list</code> procedure returns a newly allocated list of the
  489. characters of <em class="replaceable"><code>string</code></em> between <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>, in order.
  490. The <code class="literal">string-&gt;list</code> and <code class="literal">list-&gt;string</code> procedures are inverses
  491. so far as <code class="literal">equal?</code> is concerned.
  492. </p>
  493. </blockquote>
  494. </div>
  495. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875507024" class="indexterm"/> <code class="function">vector-&gt;string</code> <em class="replaceable"><code>vector</code></em> [<em class="replaceable"><code>start</code></em> [<em class="replaceable"><code>end</code></em>]]</p>
  496. <div class="blockquote">
  497. <blockquote class="blockquote">
  498. <p>The <code class="literal">vector-&gt;string</code> procedure returns a newly allocated
  499. string of the objects contained in the elements of <em class="replaceable"><code>vector</code></em>
  500. between <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>.
  501. It is an error if any element of <em class="replaceable"><code>vector</code></em> between <em class="replaceable"><code>start</code></em>
  502. and <em class="replaceable"><code>end</code></em> is not a character, or is a character forbidden in strings.
  503. </p>
  504. <pre class="screen">(vector-&gt;string #(#\1 #\2 #\3)) ⇒ "123"
  505. (vector-&gt;string #(#\1 #\2 #\3 #\4 #\5) 2 4) ⇒ "34"
  506. </pre>
  507. </blockquote>
  508. </div>
  509. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875499120" class="indexterm"/> <code class="function">string-&gt;vector</code> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> [<em class="replaceable"><code>end</code></em>]]</p>
  510. <div class="blockquote">
  511. <blockquote class="blockquote">
  512. <p>The <code class="literal">string-&gt;vector</code> procedure
  513. returns a newly created vector initialized to the elements
  514. of the string <em class="replaceable"><code>string</code></em> between <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>.
  515. </p>
  516. <pre class="screen">(string-&gt;vector "ABC") ⇒ #(#\A #\B #\C)
  517. (string-&gt;vector "ABCDE" 1 3) ⇒ #(#\B #\C)
  518. </pre>
  519. </blockquote>
  520. </div>
  521. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875492608" class="indexterm"/> <code class="function">string-upcase</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  522. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875489648" class="indexterm"/> <code class="function">string-downcase</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  523. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875486688" class="indexterm"/> <code class="function">string-titlecase</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  524. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875483728" class="indexterm"/> <code class="function">string-foldcase</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  525. <div class="blockquote">
  526. <blockquote class="blockquote">
  527. <p>These procedures take a string argument and return a string result.
  528. They are defined in terms of Unicode’s locale–independent case mappings
  529. from Unicode scalar–value sequences to scalar–value sequences. In
  530. particular, the length of the result string can be different from the
  531. length of the input string. When the specified result is equal in the
  532. sense of <code class="literal">string=?</code> to the argument, these procedures may return
  533. the argument instead of a newly allocated string.
  534. </p>
  535. <p>The <code class="literal">string-upcase</code> procedure converts a string to upper case;
  536. <code class="literal">string-downcase</code> converts a string to lower case. The
  537. <code class="literal">string-foldcase</code> procedure converts the string to its case–folded
  538. counterpart, using the full case–folding mapping, but without the
  539. special mappings for Turkic languages. The <code class="literal">string-titlecase</code>
  540. procedure converts the first cased character of each word, and downcases
  541. all other cased characters.
  542. </p>
  543. <pre class="screen">(string-upcase "Hi") ⇒ "HI"
  544. (string-downcase "Hi") ⇒ "hi"
  545. (string-foldcase "Hi") ⇒ "hi"
  546. (string-upcase "Straße") ⇒ "STRASSE"
  547. (string-downcase "Straße") ⇒ "straße"
  548. (string-foldcase "Straße") ⇒ "strasse"
  549. (string-downcase "STRASSE") ⇒ "strasse"
  550. (string-downcase "Σ") ⇒ "σ"
  551. ; Chi Alpha Omicron Sigma:
  552. (string-upcase "ΧΑΟΣ") ⇒ "ΧΑΟΣ"
  553. (string-downcase "ΧΑΟΣ") ⇒ "χαος"
  554. (string-downcase "ΧΑΟΣΣ") ⇒ "χαοσς"
  555. (string-downcase "ΧΑΟΣ Σ") ⇒ "χαος σ"
  556. (string-foldcase "ΧΑΟΣΣ") ⇒ "χαοσσ"
  557. (string-upcase "χαος") ⇒ "ΧΑΟΣ"
  558. (string-upcase "χαοσ") ⇒ "ΧΑΟΣ"
  559. (string-titlecase "kNock KNoCK") ⇒ "Knock Knock"
  560. (string-titlecase "who's there?") ⇒ "Who's There?"
  561. (string-titlecase "r6rs") ⇒ "R6rs"
  562. (string-titlecase "R6RS") ⇒ "R6rs"
  563. </pre>
  564. <p>Since these procedures are locale–independent, they may not be
  565. appropriate for some locales.
  566. </p>
  567. <p><span class="emphasis"><em>Kawa Note:</em></span> The implementation of <code class="literal">string-titlecase</code>
  568. does not correctly handle the case where an initial character
  569. needs to be converted to multiple characters, such as
  570. “LATIN SMALL LIGATURE FL” which should be converted to
  571. the two letters <code class="literal">"Fl"</code>.
  572. </p>
  573. <p><span class="emphasis"><em>Compatibility:</em></span> The result is an istring,
  574. except in compatibility mode, when it is an mstring.
  575. </p>
  576. </blockquote>
  577. </div>
  578. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875471632" class="indexterm"/> <code class="function">string-normalize-nfd</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  579. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875468672" class="indexterm"/> <code class="function">string-normalize-nfkd</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  580. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875465712" class="indexterm"/> <code class="function">string-normalize-nfc</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  581. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875462752" class="indexterm"/> <code class="function">string-normalize-nfkc</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  582. <div class="blockquote">
  583. <blockquote class="blockquote">
  584. <p>These procedures take a string argument and return a string result,
  585. which is the input string normalized to Unicode normalization form D,
  586. KD, C, or KC, respectively. When the specified result is equal in the
  587. sense of <code class="literal">string=?</code> to the argument, these procedures may return
  588. the argument instead of a newly allocated string.
  589. </p>
  590. <pre class="screen">(string-normalize-nfd "\xE9;") ⇒ "\x65;\x301;"
  591. (string-normalize-nfc "\xE9;") ⇒ "\xE9;"
  592. (string-normalize-nfd "\x65;\x301;") ⇒ "\x65;\x301;"
  593. (string-normalize-nfc "\x65;\x301;") ⇒ "\xE9;"
  594. </pre>
  595. </blockquote>
  596. </div>
  597. </section>
  598. <section class="sect2" title="Searching and matching" epub:type="division" id="idm139667875457824">
  599. <div class="titlepage">
  600. <div>
  601. <div>
  602. <h3 class="title">Searching and matching</h3>
  603. </div>
  604. </div>
  605. </div>
  606. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875456752" class="indexterm"/> <code class="function">string-prefix-length</code> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>2</sub></code></em> [<em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>2</sub></code></em>]</p>
  607. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875449472" class="indexterm"/> <code class="function">string-suffix-length</code> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>2</sub></code></em> [<em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>2</sub></code></em>]</p>
  608. <div class="blockquote">
  609. <blockquote class="blockquote">
  610. <p>Return the length of the longest common prefix/suffix of <em class="replaceable"><code>string<sub>1</sub></code></em>
  611. and <em class="replaceable"><code>string<sub>2</sub></code></em>.
  612. For prefixes, this is equivalent to their “mismatch index”
  613. (relative to the start indexes).
  614. </p>
  615. <p>The optional <em class="replaceable"><code>start</code></em>/<em class="replaceable"><code>end</code></em> indexes restrict the comparison
  616. to the indicated substrings of <em class="replaceable"><code>string<sub>1</sub></code></em> and <em class="replaceable"><code>string<sub>2</sub></code></em>.
  617. </p>
  618. </blockquote>
  619. </div>
  620. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875437280" class="indexterm"/> <code class="function">string-prefix?</code> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>2</sub></code></em> [<em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>2</sub></code></em>]</p>
  621. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875430000" class="indexterm"/> <code class="function">string-suffix?</code> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>2</sub></code></em> [<em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>2</sub></code></em>]</p>
  622. <div class="blockquote">
  623. <blockquote class="blockquote">
  624. <p>Is <em class="replaceable"><code>string<sub>1</sub></code></em> a prefix/suffix of <em class="replaceable"><code>string<sub>2</sub></code></em>?
  625. </p>
  626. <p>The optional <em class="replaceable"><code>start</code></em>/<em class="replaceable"><code>end</code></em> indexes restrict the comparison
  627. to the indicated substrings of <em class="replaceable"><code>string<sub>1</sub></code></em> and <em class="replaceable"><code>string<sub>2</sub></code></em>.
  628. </p>
  629. </blockquote>
  630. </div>
  631. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875418160" class="indexterm"/> <code class="function">string-index</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>pred</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  632. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875413984" class="indexterm"/> <code class="function">string-index-right</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>pred</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  633. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875409808" class="indexterm"/> <code class="function">string-skip</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>pred</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  634. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875405632" class="indexterm"/> <code class="function">string-skip-right</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>pred</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  635. <div class="blockquote">
  636. <blockquote class="blockquote">
  637. <p><code class="literal">string-index</code> searches through the given substring from the
  638. left, returning the index of the leftmost character satisfying the
  639. predicate <em class="replaceable"><code>pred</code></em>.
  640. <code class="literal">string-index-right</code> searches from the right, returning
  641. the index of the rightmost character satisfying the predicate <em class="replaceable"><code>pred</code></em>.
  642. If no match is found, these procedures return <code class="literal">#f</code>.
  643. </p>
  644. <p>The <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em> arguments specify the beginning and end
  645. of the search; the valid indexes relevant to the search include <em class="replaceable"><code>start</code></em>
  646. but exclude <em class="replaceable"><code>end</code></em>. Beware of “fencepost”" errors: when searching
  647. right-to-left, the first index considered is <code class="literal">(- <em class="replaceable"><code>end</code></em> 1)</code>,
  648. whereas when searching left-to-right, the first index considered is <em class="replaceable"><code>start</code></em>.
  649. That is, the start/end indexes describe the same half-open interval
  650. <code class="literal">[<em class="replaceable"><code>start</code></em>,<em class="replaceable"><code>end</code></em>)</code>
  651. in these procedures that they do in other string procedures.
  652. </p>
  653. <p>The <code class="literal">-skip</code> functions are similar, but use the complement of the
  654. criterion: they search for the first char that <span class="emphasis"><em>doesn’t</em></span> satisfy
  655. <em class="replaceable"><code>pred</code></em>. To skip over initial whitespace, for example, say
  656. </p>
  657. <pre class="screen">(substring string
  658. (or (string-skip string char-whitespace?)
  659. (string-length string))
  660. (string-length string))
  661. </pre>
  662. <p>These functions can be trivially composed with <code class="literal">string-take</code> and
  663. <code class="literal">string-drop</code> to produce <code class="literal">take-while</code>, <code class="literal">drop-while</code>,
  664. <code class="literal">span</code>, and <code class="literal">break</code> procedures without loss of efficiency.
  665. </p>
  666. </blockquote>
  667. </div>
  668. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875386752" class="indexterm"/> <code class="function">string-contains</code> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>2</sub></code></em> [<em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>2</sub></code></em>]</p>
  669. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875379504" class="indexterm"/> <code class="function">string-contains-right</code> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>2</sub></code></em> [<em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>2</sub></code></em>]</p>
  670. <div class="blockquote">
  671. <blockquote class="blockquote">
  672. <p>Does the substring of <em class="replaceable"><code>string<sub>1</sub></code></em> specified by <em class="replaceable"><code>start<sub>1</sub></code></em> and <em class="replaceable"><code>end<sub>1</sub></code></em> contain the sequence of characters given by the substring of <em class="replaceable"><code>string<sub>2</sub></code></em> specified by <em class="replaceable"><code>start<sub>2</sub></code></em> and <em class="replaceable"><code>end<sub>2</sub></code></em>?
  673. </p>
  674. <p>Returns <code class="literal">#f</code> if there is no match.
  675. If <em class="replaceable"><code>start<sub>2</sub></code></em> = <em class="replaceable"><code>end<sub>2</sub></code></em>, <code class="literal">string-contains</code>
  676. returns <em class="replaceable"><code>start<sub>1</sub></code></em> but <code class="literal">string-contains-right</code>
  677. returns <em class="replaceable"><code>end<sub>1</sub></code></em>. Otherwise returns the index in <em class="replaceable"><code>string<sub>1</sub></code></em> for the first character of the first/last match; that index lies within the half-open interval [<em class="replaceable"><code>start<sub>1</sub></code></em>,<em class="replaceable"><code>end<sub>1</sub></code></em>), and the match lies entirely within the [<em class="replaceable"><code>start<sub>1</sub></code></em>,<em class="replaceable"><code>end<sub>1</sub></code></em>) range of <em class="replaceable"><code>string<sub>1</sub></code></em>.
  678. </p>
  679. <pre class="screen">(string-contains "eek -- what a geek." "ee" 12 18) ; Searches "a geek"
  680. ⇒ 15
  681. </pre>
  682. <p>Note: The names of these procedures do not end with a question mark. This indicates a useful value is returned when there is a match.
  683. </p>
  684. </blockquote>
  685. </div>
  686. </section>
  687. <section class="sect2" title="Concatenation and replacing" epub:type="division" id="idm139667875357872">
  688. <div class="titlepage">
  689. <div>
  690. <div>
  691. <h3 class="title">Concatenation and replacing</h3>
  692. </div>
  693. </div>
  694. </div>
  695. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875356784" class="indexterm"/> <code class="function">string-append</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em> <em class="replaceable"><code>…</code></em></p>
  696. <div class="blockquote">
  697. <blockquote class="blockquote">
  698. <p>Returns a string whose characters form the concatenation
  699. of the given strings.
  700. </p>
  701. <p><span class="emphasis"><em>Compatibility:</em></span> The result is an istring,
  702. except in compatibility mode, when it is an mstring.
  703. </p>
  704. </blockquote>
  705. </div>
  706. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875352032" class="indexterm"/> <code class="function">string-concatenate</code> <em class="replaceable"><code>string-list</code></em></p>
  707. <div class="blockquote">
  708. <blockquote class="blockquote">
  709. <p>Concatenates the elements of <em class="replaceable"><code>string-list</code></em> together into a single istring.
  710. </p>
  711. <p><span class="emphasis"><em>Rationale:</em></span> Some implementations of Scheme limit the number of
  712. arguments that may be passed to an n-ary procedure, so the
  713. <code class="literal">(apply string-append <em class="replaceable"><code>string-list</code></em>)</code> idiom,
  714. which is otherwise equivalent to using this procedure, is not as portable.
  715. </p>
  716. </blockquote>
  717. </div>
  718. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875346448" class="indexterm"/> <code class="function">string-concatenate-reverse</code> <em class="replaceable"><code>string-list</code></em> [<em class="replaceable"><code>final-string</code></em> [<em class="replaceable"><code>end</code></em>]])</p>
  719. <div class="blockquote">
  720. <blockquote class="blockquote">
  721. <p>With no optional arguments, calling this procedure is equivalent to
  722. <code class="literal">(string-concatenate (reverse <em class="replaceable"><code>string-list</code></em>))</code>.
  723. If the optional argument <em class="replaceable"><code>final-string</code></em> is specified,
  724. it is effectively consed onto the beginning of <em class="replaceable"><code>string-list</code></em>
  725. before performing the list-reverse and string-concatenate operations.
  726. </p>
  727. <p>If the optional argument <em class="replaceable"><code>end</code></em> is given, only the characters up to but not including <em class="replaceable"><code>end</code></em> in <em class="replaceable"><code>final-string</code></em> are added to the result,
  728. thus producing
  729. </p>
  730. <pre class="screen">(string-concatenate
  731. (reverse (cons (substring final-string 0 end)
  732. string-list)))
  733. </pre>
  734. <p>For example:
  735. </p>
  736. <pre class="screen">(string-concatenate-reverse '(" must be" "Hello, I") " going.XXXX" 7)
  737. ⇒ "Hello, I must be going."
  738. </pre>
  739. <p><span class="emphasis"><em>Rationale:</em></span> This procedure is useful when constructing
  740. procedures that accumulate character data into lists of string
  741. buffers, and wish to convert the accumulated data into a single string
  742. when done. The optional end argument accommodates that use case when
  743. <em class="replaceable"><code>final-string</code></em> is a bob-full mutable string,
  744. and is allowed (for uniformity) when
  745. <em class="replaceable"><code>final-string</code></em> is an immutable string.
  746. </p>
  747. </blockquote>
  748. </div>
  749. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875335392" class="indexterm"/> <code class="function">string-join</code> <em class="replaceable"><code>string-list</code></em> [<em class="replaceable"><code>delimiter</code></em> [<em class="replaceable"><code>grammar</code></em>]]</p>
  750. <div class="blockquote">
  751. <blockquote class="blockquote">
  752. <p>This procedure is a simple unparser; it pastes strings together
  753. using the <em class="replaceable"><code>delimiter</code></em> string, returning an istring.
  754. </p>
  755. <p>The <em class="replaceable"><code>string-list</code></em> is a list of strings.
  756. The <em class="replaceable"><code>delimiter</code></em> is the string used to delimit elements; it defaults to a single space <code class="literal">" "</code>.
  757. </p>
  758. <p>The <em class="replaceable"><code>grammar</code></em> argument is a symbol that determines how the <em class="replaceable"><code>delimiter</code></em>
  759. is used, and defaults to <code class="literal">'infix</code>.
  760. It is an error for <em class="replaceable"><code>grammar</code></em> to be any symbol other than these four:
  761. </p>
  762. <div class="variablelist" epub:type="list">
  763. <dl class="variablelist">
  764. <dt class="term"><code class="literal">'infix</code>
  765. </dt>
  766. <dd>
  767. <p>An infix or separator grammar: insert the delimiter between list elements. An empty list will produce an empty string.
  768. </p>
  769. </dd>
  770. <dt class="term"><code class="literal">'strict-infix</code>
  771. </dt>
  772. <dd>
  773. <p>Means the same as <code class="literal">'infix</code> if the string-list is non-empty,
  774. but will signal an error if given an empty list.
  775. (This avoids an ambiguity shown in the examples below.)
  776. </p>
  777. </dd>
  778. <dt class="term"><code class="literal">'suffix</code>
  779. </dt>
  780. <dd>
  781. <p>Means a suffix or terminator grammar: insert the <em class="replaceable"><code>delimiter</code></em>
  782. after every list element.
  783. </p>
  784. </dd>
  785. <dt class="term"><code class="literal">'prefix</code>
  786. </dt>
  787. <dd>
  788. <p>Means a prefix grammar: insert the <em class="replaceable"><code>delimiter</code></em> before every list element.
  789. </p>
  790. </dd>
  791. </dl>
  792. </div>
  793. <pre class="screen">(string-join '("foo" "bar" "baz"))
  794. ⇒ "foo bar baz"
  795. (string-join '("foo" "bar" "baz") "")
  796. ⇒ "foobarbaz"
  797. (string-join '("foo" "bar" "baz") ":")
  798. ⇒ "foo:bar:baz"
  799. (string-join '("foo" "bar" "baz") ":" 'suffix)
  800. ⇒ "foo:bar:baz:"
  801. ;; Infix grammar is ambiguous wrt empty list vs. empty string:
  802. (string-join '() ":") ⇒ ""
  803. (string-join '("") ":") ⇒ ""
  804. ;; Suffix and prefix grammars are not:
  805. (string-join '() ":" 'suffix)) ⇒ ""
  806. (string-join '("") ":" 'suffix)) ⇒ ":"
  807. </pre>
  808. </blockquote>
  809. </div>
  810. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875319024" class="indexterm"/> <code class="function">string-replace</code> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>string</code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>1</sub></code></em> [<em class="replaceable"><code>start</code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>end</code></em><em class="replaceable"><code><sub>2</sub></code></em>]</p>
  811. <div class="blockquote">
  812. <blockquote class="blockquote">
  813. <p>Returns
  814. </p>
  815. <pre class="screen">(string-append (substring <em class="replaceable"><code>string<sub>1</sub></code></em> 0 <em class="replaceable"><code>start<sub>1</sub></code></em>)
  816. (substring <em class="replaceable"><code>string<sub>2</sub></code></em> <em class="replaceable"><code>start<sub>2</sub></code></em> <em class="replaceable"><code>end<sub>2</sub></code></em>)
  817. (substring <em class="replaceable"><code>string<sub>1</sub></code></em> <em class="replaceable"><code>end<sub>1</sub></code></em> (string-length <em class="replaceable"><code>string<sub>1</sub></code></em>)))
  818. </pre>
  819. <p>That is, the segment of characters in <em class="replaceable"><code>string<sub>1</sub></code></em> from <em class="replaceable"><code>start<sub>1</sub></code></em>
  820. to <em class="replaceable"><code>end<sub>1</sub></code></em> is replaced by the segment of characters in <em class="replaceable"><code>string<sub>2</sub></code></em> from <em class="replaceable"><code>start<sub>2</sub></code></em> to <em class="replaceable"><code>end<sub>2</sub></code></em>.
  821. If <em class="replaceable"><code>start<sub>1</sub></code></em>=<em class="replaceable"><code>end<sub>1</sub></code></em>, this simply splices the characters
  822. drawn from <em class="replaceable"><code>string<sub>2</sub></code></em> into <em class="replaceable"><code>string<sub>1</sub></code></em> at that position.
  823. </p>
  824. <p>Examples:
  825. </p>
  826. <pre class="screen">(string-replace "The TCL programmer endured daily ridicule."
  827. "another miserable perl drone" 4 7 8 22)
  828. ⇒ "The miserable perl programmer endured daily ridicule."
  829. (string-replace "It's easy to code it up in Scheme." "lots of fun" 5 9)
  830. ⇒ "It's lots of fun to code it up in Scheme."
  831. (define (string-insert s i t) (string-replace s t i i))
  832. (string-insert "It's easy to code it up in Scheme." 5 "really ")
  833. ⇒ "It's really easy to code it up in Scheme."
  834. (define (string-set s i c) (string-replace s (string c) i (+ i 1)))
  835. (string-set "String-ref runs in O(n) time." 19 #\1)
  836. ⇒ "String-ref runs in O(1) time."
  837. </pre>
  838. </blockquote>
  839. </div>
  840. <p>Also see <code class="literal">string-append!</code> and <code class="literal">string-replace!</code>
  841. for destructive changes to a mutable string.
  842. </p>
  843. </section>
  844. <section class="sect2" title="Mapping and folding" epub:type="division" id="idm139667875295264">
  845. <div class="titlepage">
  846. <div>
  847. <div>
  848. <h3 class="title">Mapping and folding</h3>
  849. </div>
  850. </div>
  851. </div>
  852. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875294192" class="indexterm"/> <code class="function">string-fold</code> <em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>knil</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  853. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875289600" class="indexterm"/> <code class="function">string-fold-right</code> <em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>knil</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  854. <div class="blockquote">
  855. <blockquote class="blockquote">
  856. <p>These are the fundamental iterators for strings.
  857. </p>
  858. <p>The <code class="literal">string-fold</code> procedure maps the <em class="replaceable"><code>kons</code></em> procedure across
  859. the given <em class="replaceable"><code>string</code></em> from left to right:
  860. </p>
  861. <pre class="screen">(... (<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub>2</sub> (<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub>1</sub> (<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub>0</sub> <em class="replaceable"><code>knil</code></em>))))
  862. </pre>
  863. <p>In other words, string-fold obeys the (tail) recursion
  864. </p>
  865. <pre class="screen"> (string-fold <em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>knil</code></em> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>)
  866. = (string-fold <em class="replaceable"><code>kons</code></em> (<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub>start</sub> <em class="replaceable"><code>knil</code></em>) <em class="replaceable"><code>start+1</code></em> <em class="replaceable"><code>end</code></em>)
  867. </pre>
  868. <p>The <code class="literal">string-fold-right</code> procedure maps <em class="replaceable"><code>kons</code></em> across the given
  869. string <em class="replaceable"><code>string</code></em> from right to left:
  870. </p>
  871. <pre class="screen">(<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub>0</sub>
  872. (... (<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub><em class="replaceable"><code>end-3</code></em></sub>
  873. (<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub><em class="replaceable"><code>end-2</code></em></sub>
  874. (<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub><em class="replaceable"><code>end-1</code></em></sub>
  875. <em class="replaceable"><code>knil</code></em>)))))
  876. </pre>
  877. <p>obeying the (tail) recursion
  878. </p>
  879. <pre class="screen"> (string-fold-right <em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>knil</code></em> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>)
  880. = (string-fold-right <em class="replaceable"><code>kons</code></em> (<em class="replaceable"><code>kons</code></em> <em class="replaceable"><code>string</code></em><sub><em class="replaceable"><code>end-1</code></em></sub> <em class="replaceable"><code>knil</code></em>) <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end-1</code></em>)
  881. </pre>
  882. <p>Examples:
  883. </p>
  884. <pre class="screen">;;; Convert a string or string to a list of chars.
  885. (string-fold-right cons '() string)
  886. ;;; Count the number of lower-case characters in a string or string.
  887. (string-fold (lambda (c count)
  888. (if (char-lower-case? c)
  889. (+ count 1)
  890. count))
  891. 0
  892. string)
  893. </pre>
  894. <p>The string-fold-right combinator is sometimes called a "catamorphism."
  895. </p>
  896. </blockquote>
  897. </div>
  898. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875259072" class="indexterm"/> <code class="function">string-for-each</code> <em class="replaceable"><code><em class="replaceable"><code>proc</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  899. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875253840" class="indexterm"/> <code class="function">string-for-each</code> <em class="replaceable"><code><em class="replaceable"><code>proc</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> [<em class="replaceable"><code>start</code></em> [<em class="replaceable"><code>end</code></em>]]</p>
  900. <div class="blockquote">
  901. <blockquote class="blockquote">
  902. <p>The <em class="replaceable"><code>string</code></em>s must all have the same length. <em class="replaceable"><code>proc</code></em> should
  903. accept as many arguments as there are <em class="replaceable"><code>string</code></em>s.
  904. </p>
  905. <p>The <em class="replaceable"><code>start</code></em>-<em class="replaceable"><code>end</code></em> variant is provided for compatibility
  906. with the SRFI-13 version. (In that case <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>
  907. count code Unicode scalar values (<code class="literal">character</code> values),
  908. not Java 16-bit <code class="literal">char</code> values.)
  909. </p>
  910. <p>The <code class="literal">string-for-each</code> procedure applies <em class="replaceable"><code>proc</code></em> element–wise to
  911. the characters of the <em class="replaceable"><code>string</code></em>s for its side effects, in order from
  912. the first characters to the last. <em class="replaceable"><code>proc</code></em> is always called in the
  913. same dynamic environment as <code class="literal">string-for-each</code> itself.
  914. </p>
  915. <p>Analogous to <code class="literal">for-each</code>.
  916. </p>
  917. <pre class="screen">(let ((v '()))
  918. (string-for-each
  919. (lambda (c) (set! v (cons (char-&gt;integer c) v)))
  920. "abcde")
  921. v)
  922. ⇒ (101 100 99 98 97)
  923. </pre>
  924. <p><span class="emphasis"><em>Performance note:</em></span> The compiler generates efficient code
  925. for <code class="literal">string-for-each</code>.
  926. If <em class="replaceable"><code>proc</code></em> is a lambda expression, it is inlined.
  927. </p>
  928. </blockquote>
  929. </div>
  930. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875237776" class="indexterm"/> <code class="function">string-map</code> <em class="replaceable"><code><em class="replaceable"><code>proc</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>1</sub></code></em> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em><em class="replaceable"><code><sub>2</sub></code></em> <em class="replaceable"><code>…</code></em></p>
  931. <div class="blockquote">
  932. <blockquote class="blockquote">
  933. <p>The <code class="literal">string-map</code> procedure applies <em class="replaceable"><code>proc</code></em> element-wise to
  934. the elements of the strings and returns a string of the results, in order.
  935. It is an error if <em class="replaceable"><code>proc</code></em> does not accept as many arguments as there
  936. are strings, or return other than a single character or a string.
  937. If more than one string is given and not all strings have the same length,
  938. <code class="literal">string-map</code> terminates when the shortest string runs out.
  939. The dynamic order in
  940. which <em class="replaceable"><code>proc</code></em> is applied to the elements of the strings is unspecified.
  941. </p>
  942. <pre class="screen">(string-map char-foldcase "AbdEgH") ⇒ "abdegh"
  943. </pre>
  944. <pre class="screen">(string-map
  945. (lambda (c) (integer-&gt;char (+ 1 (char-&gt;integer c))))
  946. "HAL")
  947. ⇒ "IBM"
  948. </pre>
  949. <pre class="screen">(string-map
  950. (lambda (c k)
  951. ((if (eqv? k #\u) char-upcase char-downcase) c))
  952. "studlycaps xxx"
  953. "ululululul")
  954. ⇒ "StUdLyCaPs"
  955. </pre>
  956. <p>Traditionally the result of <em class="replaceable"><code>proc</code></em> had to be a character,
  957. but Kawa (and SRFI-140) allows the result to be a string.
  958. </p>
  959. <p><span class="emphasis"><em>Performance note:</em></span> The <code class="literal">string-map</code> procedure has not been
  960. optimized (mainly because it is not very useful):
  961. The characters are boxed, and the <em class="replaceable"><code>proc</code></em> is not inlined even if
  962. it is a lambda expression.
  963. </p>
  964. </blockquote>
  965. </div>
  966. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875224720" class="indexterm"/> <code class="function">string-map-index</code> <em class="replaceable"><code>proc</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  967. <div class="blockquote">
  968. <blockquote class="blockquote">
  969. <p>Calls <em class="replaceable"><code>proc</code></em> on each valid index of the specified substring, converts
  970. the results of those calls into strings, and returns the concatenation
  971. of those strings. It is an error for <em class="replaceable"><code>proc</code></em> to return anything other
  972. than a character or string. The dynamic order in which proc is called
  973. on the indexes is unspecified, as is the dynamic order in which the
  974. coercions are performed. If any strings returned by <em class="replaceable"><code>proc</code></em> are mutated
  975. after they have been returned and before the call to <code class="literal">string-map-index</code>
  976. has returned, then <code class="literal">string-map-index</code> returns a string with unspecified
  977. contents; the <em class="replaceable"><code>string-map-index</code></em> procedure itself does not mutate those
  978. strings.
  979. </p>
  980. </blockquote>
  981. </div>
  982. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875216720" class="indexterm"/> <code class="function">string-for-each-index</code> <em class="replaceable"><code>proc</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  983. <div class="blockquote">
  984. <blockquote class="blockquote">
  985. <p>Calls <em class="replaceable"><code>proc</code></em> on each valid index of the specified substring, in
  986. increasing order, discarding the results of those calls. This is
  987. simply a safe and correct way to loop over a substring.
  988. </p>
  989. <p>Example:
  990. </p>
  991. <pre class="screen">(let ((txt (string-&gt;string "abcde"))
  992. (v '()))
  993. (string-for-each-index
  994. (lambda (cur) (set! v (cons (char-&gt;integer (string-ref txt cur)) v)))
  995. txt)
  996. v) ⇒ (101 100 99 98 97)
  997. </pre>
  998. </blockquote>
  999. </div>
  1000. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875210336" class="indexterm"/> <code class="function">string-count</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>pred</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  1001. <div class="blockquote">
  1002. <blockquote class="blockquote">
  1003. <p>Returns a count of the number of characters in the specified substring
  1004. of <em class="replaceable"><code>string</code></em> that satisfy the predicate <em class="replaceable"><code>pred</code></em>.
  1005. </p>
  1006. </blockquote>
  1007. </div>
  1008. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875204672" class="indexterm"/> <code class="function">string-filter</code> <em class="replaceable"><code>pred</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  1009. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875200496" class="indexterm"/> <code class="function">string-remove</code> <em class="replaceable"><code>pred</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  1010. <div class="blockquote">
  1011. <blockquote class="blockquote">
  1012. <p>Return an immutable string consisting of only selected characters, in order:
  1013. <code class="literal">string-filter</code> selects only the characters that satisfy <em class="replaceable"><code>pred</code></em>;
  1014. <code class="literal">string-remove</code> selects only the characters that <span class="emphasis"><em>not</em></span>
  1015. satisfy <em class="replaceable"><code>pred</code></em>
  1016. </p>
  1017. </blockquote>
  1018. </div>
  1019. </section>
  1020. <section class="sect2" title="Replication &amp; splitting" epub:type="division" id="idm139667875193520">
  1021. <div class="titlepage">
  1022. <div>
  1023. <div>
  1024. <h3 class="title">Replication &amp; splitting</h3>
  1025. </div>
  1026. </div>
  1027. </div>
  1028. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875192432" class="indexterm"/> <code class="function">string-repeat</code> <em class="replaceable"><code>string-or-character</code></em> <em class="replaceable"><code>len</code></em></p>
  1029. <div class="blockquote">
  1030. <blockquote class="blockquote">
  1031. <p>Create an istring by repeating the first argument <em class="replaceable"><code>len</code></em> times.
  1032. If the first argument is a character, it is as if it were wrapped with
  1033. the <code class="literal">string</code> constructor.
  1034. We can define string-repeat in terms of the more general <code class="literal">xsubstring</code>
  1035. procedure:
  1036. </p>
  1037. <pre class="screen">(define (string-repeat S N)
  1038. (let ((T (if (char? S) (string S) S)))
  1039. (xsubstring T 0 (* N (string-length T))))
  1040. </pre>
  1041. </blockquote>
  1042. </div>
  1043. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875186832" class="indexterm"/> <code class="function">xsubstring</code> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>from</code></em> <em class="replaceable"><code>to</code></em> [<em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]]</p>
  1044. <div class="blockquote">
  1045. <blockquote class="blockquote">
  1046. <p>This is an extended substring procedure that implements replicated copying of a substring.
  1047. The <em class="replaceable"><code>string</code></em> is a string; <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em> are optional arguments that specify a substring of <em class="replaceable"><code>string</code></em>,
  1048. defaulting to 0 and the length of <em class="replaceable"><code>string</code></em>.
  1049. This substring is conceptually replicated both up and down the index space,
  1050. in both the positive and negative directions.
  1051. For example, if <em class="replaceable"><code>string</code></em> is <code class="literal">"abcdefg"</code>, <em class="replaceable"><code>start</code></em> is 3,
  1052. and <em class="replaceable"><code>end</code></em> is 6, then we have the conceptual bidirectionally-infinite string
  1053. </p>
  1054. <pre class="screen"> ... d e f d e f d e f d e f d e f d e f d ...
  1055. -9 -8 -7 -6 -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5 +6 +7 +8 +9
  1056. </pre>
  1057. <p><code class="literal">xsubstring</code> returns the substring of the <em class="replaceable"><code>string</code></em> beginning
  1058. at index <em class="replaceable"><code>from</code></em>, and ending at <em class="replaceable"><code>to</code></em>.
  1059. It is an error if <em class="replaceable"><code>from</code></em> is greater than <em class="replaceable"><code>to</code></em>.
  1060. </p>
  1061. <p>If <em class="replaceable"><code>from</code></em> and <em class="replaceable"><code>to</code></em> are missing they default to 0 and
  1062. <em class="replaceable"><code>from</code></em>+(<em class="replaceable"><code>end</code></em>-<em class="replaceable"><code>start</code></em>), respectively.
  1063. This variant is a generalization of using <code class="literal">substring</code>,
  1064. but unlike <code class="literal">substring</code> never shares substructures that would
  1065. retain characters or sequences of characters that are substructures of
  1066. its first argument or previously allocated objects.
  1067. </p>
  1068. <p>You can use <code class="literal">xsubstring</code> to perform a variety of tasks:
  1069. </p>
  1070. <div class="itemizedlist" epub:type="list">
  1071. <ul style="list-style-type: disc; " class="itemizedlist">
  1072. <li class="listitem" epub:type="list-item">
  1073. <p>To rotate a string left: <code class="literal">(xsubstring "abcdef" 2 8) ⇒ "cdefab"</code>
  1074. </p>
  1075. </li>
  1076. <li class="listitem" epub:type="list-item">
  1077. <p>To rotate a string right: <code class="literal">(xsubstring "abcdef" -2 4) ⇒ "efabcd"</code>
  1078. </p>
  1079. </li>
  1080. <li class="listitem" epub:type="list-item">
  1081. <p>To replicate a string: <code class="literal">(xsubstring "abc" 0 7) ⇒ "abcabca"</code>
  1082. </p>
  1083. </li>
  1084. </ul>
  1085. </div>
  1086. <p>Note that
  1087. </p>
  1088. <div class="itemizedlist" epub:type="list">
  1089. <ul style="list-style-type: disc; " class="itemizedlist">
  1090. <li class="listitem" epub:type="list-item">
  1091. <p>The <em class="replaceable"><code>from</code></em>/<em class="replaceable"><code>to</code></em> arguments give a half-open range containing the
  1092. characters from index <em class="replaceable"><code>from</code></em> up to, but not including, index <em class="replaceable"><code>to</code></em>.
  1093. </p>
  1094. </li>
  1095. <li class="listitem" epub:type="list-item">
  1096. <p>The <em class="replaceable"><code>from</code></em>/<em class="replaceable"><code>to</code></em> indexes are not expressed in the index space of
  1097. <em class="replaceable"><code>string</code></em>. They refer instead to the replicated index space of the
  1098. substring defined by <em class="replaceable"><code>string</code></em>, <em class="replaceable"><code>start</code></em>, and <em class="replaceable"><code>end</code></em>.
  1099. </p>
  1100. </li>
  1101. </ul>
  1102. </div>
  1103. <p>It is an error if <em class="replaceable"><code>start</code></em>=<em class="replaceable"><code>end</code></em>, unless <em class="replaceable"><code>from</code></em>=<em class="replaceable"><code>to</code></em>,
  1104. which is allowed as a special case.
  1105. </p>
  1106. </blockquote>
  1107. </div>
  1108. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875159200" class="indexterm"/> <code class="function">string-split</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>delimiter</code></em> [<em class="replaceable"><code>grammar</code></em> <em class="replaceable"><code>limit</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>]</p>
  1109. <div class="blockquote">
  1110. <blockquote class="blockquote">
  1111. <p>Returns a list of strings representing the words contained in the substring of <em class="replaceable"><code>string</code></em> from <em class="replaceable"><code>start</code></em> (inclusive) to <em class="replaceable"><code>end</code></em> (exclusive).
  1112. The <em class="replaceable"><code>delimiter</code></em> is a string to be used as the word separator.
  1113. This will often be a single character, but multiple characters are
  1114. allowed for use cases such as splitting on <code class="literal">"\r\n"</code>.
  1115. The returned list will have one more item than the number of non-overlapping
  1116. occurrences of the <em class="replaceable"><code>delimiter</code></em> in the string.
  1117. If <em class="replaceable"><code>delimiter</code></em> is an empty string, then the returned list contains a
  1118. list of strings, each of which contains a single character.
  1119. </p>
  1120. <p>The <em class="replaceable"><code>grammar</code></em> is a symbol with the same meaning as in
  1121. the <code class="literal">string-join</code> procedure.
  1122. If it is <code class="literal">infix</code>, which is the default, processing is done as
  1123. described above, except an empty string produces the empty list;
  1124. if grammar is <code class="literal">strict-infix</code>, then an empty string signals an error.
  1125. The values <code class="literal">prefix</code> and <code class="literal">suffix</code> cause a leading/trailing empty string in the result to be suppressed.
  1126. </p>
  1127. <p>If <em class="replaceable"><code>limit</code></em> is a non-negative exact integer, at most that many splits occur, and the remainder of string is returned as the final element of the list (so the result will have at most limit+1 elements). If limit is not specified or is #f, then as many splits as possible are made. It is an error if limit is any other value.
  1128. </p>
  1129. <p>To split on a regular expression, you can use SRFI 115’s <code class="literal">regexp-split</code>
  1130. procedure.
  1131. </p>
  1132. </blockquote>
  1133. </div>
  1134. </section>
  1135. <section class="sect2" title="String mutation" epub:type="division" id="idm139667875144736">
  1136. <div class="titlepage">
  1137. <div>
  1138. <div>
  1139. <h3 class="title">String mutation</h3>
  1140. </div>
  1141. </div>
  1142. </div>
  1143. <p>The following procedures create a mutable string,
  1144. i.e. one that you can modify.
  1145. </p>
  1146. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875143184" class="indexterm"/> <code class="function">make-string</code> [<em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em> [<em class="replaceable"><code><em class="replaceable"><code>char</code></em></code></em>]]</p>
  1147. <div class="blockquote">
  1148. <blockquote class="blockquote">
  1149. <p>Return a newly allocated mstring of <em class="replaceable"><code>k</code></em> characters,
  1150. where <em class="replaceable"><code>k</code></em> defaults to 0. If <em class="replaceable"><code>char</code></em> is
  1151. given, then all elements of the string are initialized to <em class="replaceable"><code>char</code></em>,
  1152. otherwise the contents of the <em class="replaceable"><code>string</code></em> are unspecified.
  1153. </p>
  1154. <p>The 1-argument version is deprecated as poor style, except when k is 0.
  1155. </p>
  1156. <p><span class="emphasis"><em>Rationale:</em></span> In many languags the most common pattern for mutable strings
  1157. is to allocate an empty string and incrementally append to it.
  1158. It seems natural to initialize the string
  1159. with <code class="literal">(make-string)</code>, rather than <code class="literal">(make-string 0)</code>.
  1160. </p>
  1161. <p>To return an immutable string that repeats <em class="replaceable"><code>k</code></em> times a character
  1162. <em class="replaceable"><code>char</code></em> use <code class="literal">string-repeat</code>.
  1163. </p>
  1164. <p>This is as R7RS, except the result is variable-size and we allow
  1165. leaving out <em class="replaceable"><code>k</code></em> when it is zero.
  1166. </p>
  1167. </blockquote>
  1168. </div>
  1169. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875131824" class="indexterm"/> <code class="function">string-copy</code> <em class="replaceable"><code><em class="replaceable"><code>string</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>
  1170. <div class="blockquote">
  1171. <blockquote class="blockquote">
  1172. <p>Returns a newly allocated mutable (mstring) copy of the part of the given
  1173. <em class="replaceable"><code>string</code></em> between <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>.
  1174. </p>
  1175. </blockquote>
  1176. </div>
  1177. <p>The following procedures modify a mutable string.
  1178. </p>
  1179. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875125344" class="indexterm"/> <code class="function">string-set!</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>k</code></em> <em class="replaceable"><code>char</code></em></p>
  1180. <div class="blockquote">
  1181. <blockquote class="blockquote">
  1182. <p>This procedure stores <em class="replaceable"><code>char</code></em> in element <em class="replaceable"><code>k</code></em> of <em class="replaceable"><code>string</code></em>.
  1183. </p>
  1184. <pre class="screen">(define s1 (make-string 3 #\*))
  1185. (define s2 "***")
  1186. (string-set! s1 0 #\?) ⇒ <span class="emphasis"><em>void</em></span>
  1187. s1 ⇒ "?**"
  1188. (string-set! s2 0 #\?) ⇒ <span class="emphasis"><em>error</em></span>
  1189. (string-set! (symbol-&gt;string 'immutable) 0 #\?) ⇒ <span class="emphasis"><em>error</em></span>
  1190. </pre>
  1191. <p><span class="emphasis"><em>Performance note:</em></span> Calling <code class="literal">string-set!</code> may take time proportional
  1192. to the length of the string: First it must scan for the right position,
  1193. like <code class="literal">string-ref</code> does. Then if the new character requires
  1194. using a surrogate pair (and the old one doesn’t) then we have to make room
  1195. in the string, possibly re-allocating a new <code class="literal">char</code> array.
  1196. Alternatively, if the old character requires using a surrogate pair
  1197. (and the new one doesn’t) then following characters need to be moved.
  1198. </p>
  1199. <p>The function <code class="literal">string-set!</code> is deprecated: It is inefficient,
  1200. and it very seldom does the correct thing. Instead, you can
  1201. construct a string with <code class="literal">string-append!</code>.
  1202. </p>
  1203. </blockquote>
  1204. </div>
  1205. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875114000" class="indexterm"/> <code class="function">string-append!</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>value</code></em></code></em> <em class="replaceable"><code>…</code></em></p>
  1206. <div class="blockquote">
  1207. <blockquote class="blockquote">
  1208. <p>The <em class="replaceable"><code>string</code></em> must be a mutable string, such as one returned
  1209. by <code class="literal">make-string</code> or <code class="literal">string-copy</code>.
  1210. The <code class="literal">string-append!</code> procedure extends <em class="replaceable"><code>string</code></em>
  1211. by appending each <em class="replaceable"><code>value</code></em> (in order) to the end of <em class="replaceable"><code>string</code></em>.
  1212. Each <code class="literal">value</code> should be a character or a string.
  1213. </p>
  1214. <p><span class="emphasis"><em>Performance note:</em></span> The compiler converts a call with multiple <em class="replaceable"><code>value</code></em>s
  1215. to multiple <code class="literal">string-append!</code> calls.
  1216. If a <em class="replaceable"><code>value</code></em> is known to be a <code class="literal">character</code>, then
  1217. no boxing (object-allocation) is needed.
  1218. </p>
  1219. <p>The following example shows how to efficiently process a string
  1220. using <code class="literal">string-for-each</code> and incrementally “build” a result string
  1221. using <code class="literal">string-append!</code>.
  1222. </p>
  1223. <pre class="screen">(define (translate-space-to-newline str::string)::string
  1224. (let ((result (make-string 0)))
  1225. (string-for-each
  1226. (lambda (ch)
  1227. (string-append! result
  1228. (if (char=? ch #\Space) #\Newline ch)))
  1229. str)
  1230. result))
  1231. </pre>
  1232. </blockquote>
  1233. </div>
  1234. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875101232" class="indexterm"/> <code class="function">string-copy!</code> <em class="replaceable"><code><em class="replaceable"><code>to</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>at</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>from</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>
  1235. <div class="blockquote">
  1236. <blockquote class="blockquote">
  1237. <p>Copies the characters of the string <em class="replaceable"><code>from</code></em> that are between
  1238. <em class="replaceable"><code>start</code></em> end <em class="replaceable"><code>end</code></em> into the string <em class="replaceable"><code>to</code></em>,
  1239. starting at index <em class="replaceable"><code>at</code></em>. The order in which characters are copied
  1240. is unspecified, except that if the source and destination overlap,
  1241. copying takes place as if the source is first copied into a
  1242. temporary string and then into the destination.
  1243. (This is achieved without allocating storage by making sure to copy in
  1244. the correct direction in such circumstances.)
  1245. </p>
  1246. <p>This is equivalent to (and implemented as):
  1247. </p>
  1248. <pre class="screen">(string-replace! to at (+ at (- end start)) from start end))
  1249. </pre>
  1250. <pre class="screen">(define a "12345")
  1251. (define b (string-copy "abcde"))
  1252. (string-copy! b 1 a 0 2)
  1253. b ⇒ "a12de"
  1254. </pre>
  1255. </blockquote>
  1256. </div>
  1257. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875091760" class="indexterm"/> <code class="function">string-replace!</code> <em class="replaceable"><code><em class="replaceable"><code>dst</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>dst-start</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>dst-end</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>src</code></em></code></em> [<em class="replaceable"><code><em class="replaceable"><code>src-start</code></em></code></em> [<em class="replaceable"><code><em class="replaceable"><code>src-end</code></em></code></em>]]</p>
  1258. <div class="blockquote">
  1259. <blockquote class="blockquote">
  1260. <p>Replaces the characters of string <em class="replaceable"><code>dst</code></em> (between <em class="replaceable"><code>dst-start</code></em> and <em class="replaceable"><code>dst-end</code></em>) with the characters of <em class="replaceable"><code>src</code></em> (between <em class="replaceable"><code>src-start</code></em> and <em class="replaceable"><code>src-end</code></em>).
  1261. The number of characters from <em class="replaceable"><code>src</code></em> may be different than the
  1262. number replaced in <em class="replaceable"><code>dst</code></em>, so the string may grow or contract.
  1263. The special case where <em class="replaceable"><code>dst-start</code></em> is equal to <em class="replaceable"><code>dst-end</code></em> corresponds to
  1264. insertion; the case where <em class="replaceable"><code>src-start</code></em> is equal to <em class="replaceable"><code>src-end</code></em>
  1265. corresponds to deletion.
  1266. The order in which characters are copied
  1267. is unspecified, except that if the source and destination overlap,
  1268. copying takes place as if the source is first copied into a
  1269. temporary string and then into the destination.
  1270. (This is achieved without allocating storage by making sure to copy in
  1271. the correct direction in such circumstances.)
  1272. </p>
  1273. </blockquote>
  1274. </div>
  1275. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875079728" class="indexterm"/> <code class="function">string-fill!</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>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>
  1276. <div class="blockquote">
  1277. <blockquote class="blockquote">
  1278. <p>The <code class="literal">string-fill!</code> procedure stores <em class="replaceable"><code>fill</code></em> in the elements
  1279. of <em class="replaceable"><code>string</code></em> between <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>.
  1280. It is an error if <em class="replaceable"><code>fill</code></em> is not a character or is forbidden in strings.
  1281. </p>
  1282. </blockquote>
  1283. </div>
  1284. </section>
  1285. <section class="sect2" title="Strings as sequences" epub:type="division" id="idm139667875071808">
  1286. <div class="titlepage">
  1287. <div>
  1288. <div>
  1289. <h3 class="title">Strings as sequences</h3>
  1290. </div>
  1291. </div>
  1292. </div>
  1293. <section class="sect3" title="Indexing a string" epub:type="division" id="idm139667875070864">
  1294. <div class="titlepage">
  1295. <div>
  1296. <div>
  1297. <h4 class="title">Indexing a string</h4>
  1298. </div>
  1299. </div>
  1300. </div>
  1301. <p>Using function-call syntax with strings is convenient
  1302. and efficient. However, it has some “gotchas”.
  1303. </p>
  1304. <p>We will use the following example string:
  1305. </p>
  1306. <pre class="screen">(! str1 "Smile \x1f603;!")
  1307. </pre>
  1308. <p>or if you’re brave:
  1309. </p>
  1310. <pre class="screen">(! str1 "Smile 😃!")
  1311. </pre>
  1312. <p>This is <code class="literal">"Smile "</code> followed by an emoticon (“smiling face with
  1313. open mouth”) followed by <code class="literal">"!"</code>.
  1314. The emoticon has scalar value <code class="literal">\x1f603</code> - it is not
  1315. in the 16-bit Basic Multi-language Plane,
  1316. and so it must be encoded by a surrogate pair
  1317. (<code class="literal">#\xd83d</code> followed by <code class="literal">#\xde03</code>).
  1318. </p>
  1319. <p>The number of scalar values (<code class="literal">character</code>s) is 8,
  1320. while the number of 16-bits code units (<code class="literal">char</code>s) is 9.
  1321. The <code class="literal">java.lang.CharSequence:length</code> method
  1322. counts <code class="literal">char</code>s. Both the <code class="literal">length</code> and the
  1323. <code class="literal">string-length</code> procedures count <code class="literal">character</code>s. Thus:
  1324. </p>
  1325. <pre class="screen">(length str1) ⇒ 8
  1326. (string-length str1) ⇒ 8
  1327. (str1:length) ⇒ 9
  1328. </pre>
  1329. <p>Counting <code class="literal">char</code>s is a constant-time operation (since it
  1330. is stored in the data structure).
  1331. Counting <code class="literal">character</code>s depends on the representation used:
  1332. In geneeral it may take time proportional to the length of
  1333. the string, since it has to subtract one for each surrogate pair;
  1334. however the <em class="replaceable"><code>istring</code></em> type (<code class="literal">gnu.lists.IString</code> class)
  1335. uses a extra structure so it can count characters in constant-time.
  1336. </p>
  1337. <p>Similarly we can can index the string in 3 ways:
  1338. </p>
  1339. <pre class="screen">(str1 1) ⇒ #\m :: character
  1340. (string-ref str1 1) ⇒ #\m :: character
  1341. (str1:charAt 1) ⇒ #\m :: char
  1342. </pre>
  1343. <p>Using function-call syntax when the “function” is a string
  1344. and a single integer argument is the same as using <code class="literal">string-ref</code>.
  1345. </p>
  1346. <p>Things become interesting when we reach the emoticon:
  1347. </p>
  1348. <pre class="screen">(str1 6) ⇒ #\😃 :: character
  1349. (str1:charAt 6) ⇒ #\d83d :: char
  1350. </pre>
  1351. <p>Both <code class="literal">string-ref</code> and the function-call syntax return the
  1352. real character, while the <code class="literal">charAt</code> methods returns a partial character.
  1353. </p>
  1354. <pre class="screen">(str1 7) ⇒ #\! :: character
  1355. (str1:charAt 7) ⇒ #\de03 :: char
  1356. (str1 8) ⇒ <span class="emphasis"><em>throws</em></span> StringIndexOutOfBoundsException
  1357. (str1:charAt 8) ⇒ #\! :: char
  1358. </pre>
  1359. </section>
  1360. <section class="sect3" title="Indexing with a sequence" epub:type="division" id="idm139667875052688">
  1361. <div class="titlepage">
  1362. <div>
  1363. <div>
  1364. <h4 class="title">Indexing with a sequence</h4>
  1365. </div>
  1366. </div>
  1367. </div>
  1368. <p>You can index a string with a list of integer indexes,
  1369. most commonly a range:
  1370. </p>
  1371. <pre class="screen">(<em class="replaceable"><code>str</code></em> [<em class="replaceable"><code>i</code></em> ...])
  1372. </pre>
  1373. <p>is basically the same as:
  1374. </p>
  1375. <pre class="screen">(string (<em class="replaceable"><code>str</code></em> <em class="replaceable"><code>i</code></em>) ...)
  1376. </pre>
  1377. <p>Generally when working with strings it is best to
  1378. work with substrings rather than individual characters:
  1379. </p>
  1380. <pre class="screen">(<em class="replaceable"><code>str</code></em> [<em class="replaceable"><code>start</code></em> &lt;: <em class="replaceable"><code>end</code></em>])
  1381. </pre>
  1382. <p>This is equivalent to invoking the <code class="literal">substring</code> procedure:
  1383. </p>
  1384. <pre class="screen">(substring <em class="replaceable"><code>str</code></em> <em class="replaceable"><code>start</code></em> <em class="replaceable"><code>end</code></em>)
  1385. </pre>
  1386. <span id="String-Cursor-API"/>
  1387. </section>
  1388. </section>
  1389. <section class="sect2" title="String Cursor API" epub:type="division" id="idm139667875043024">
  1390. <div class="titlepage">
  1391. <div>
  1392. <div>
  1393. <h3 class="title">String Cursor API</h3>
  1394. </div>
  1395. </div>
  1396. </div>
  1397. <p>Indexing into a string (using for example <code class="literal">string-ref</code>)
  1398. is inefficient because of the possible presence of surrogate pairs.
  1399. Hence given an index <em class="replaceable"><code>i</code></em> access normally requires linearly
  1400. scanning the string until we have seen <em class="replaceable"><code>i</code></em> characters.
  1401. </p>
  1402. <p>The string-cursor API is defined in terms of abstract “cursor values”,
  1403. which point to a position in the string. This avoids the linear scan.
  1404. </p>
  1405. <p>Typical usage is:
  1406. </p>
  1407. <pre class="screen">(let* ((str <em class="replaceable"><code>whatever</code></em>)
  1408. (end (string-cursor-end str)))
  1409. (do ((sc::string-cursor (string-cursor-start str)
  1410. (string-cursor-next str sc)))
  1411. ((string-cursor&gt;=? sc end))
  1412. (let ((ch (string-cursor-ref str sc)))
  1413. (<em class="replaceable"><code>do-something-with</code></em> ch))))
  1414. </pre>
  1415. <p>Alternatively, the following may be marginally faster:
  1416. </p>
  1417. <pre class="screen">(let* ((str <em class="replaceable"><code>whatever</code></em>)
  1418. (end (string-cursor-end str)))
  1419. (do ((sc::string-cursor (string-cursor-start str)
  1420. (string-cursor-next-quick sc)))
  1421. ((string-cursor&gt;=? sc end))
  1422. (let ((ch (string-cursor-ref str sc)))
  1423. (if (not (char=? ch #\ignorable-char))
  1424. (<em class="replaceable"><code>do-something-with</code></em> ch)))))
  1425. </pre>
  1426. <p>The API is non-standard, but is based on that in Chibi Scheme.
  1427. </p>
  1428. <p class="synopsis" kind="Type"><span class="kind">Type</span><span class="ignore">: </span><a id="idm139667875035152" class="indexterm"/> <code class="function">string-cursor</code></p>
  1429. <div class="blockquote">
  1430. <blockquote class="blockquote">
  1431. <p>An abstract position (index) in a string.
  1432. Implemented as a primitive <code class="literal">int</code> which counts the
  1433. number of preceding code units (16-bit <code class="literal">char</code> values).
  1434. </p>
  1435. </blockquote>
  1436. </div>
  1437. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875031232" class="indexterm"/> <code class="function">string-cursor-start</code> <em class="replaceable"><code>str</code></em></p>
  1438. <div class="blockquote">
  1439. <blockquote class="blockquote">
  1440. <p>Returns a cursor for the start of the string.
  1441. The result is always 0, cast to a <code class="literal">string-cursor</code>.
  1442. </p>
  1443. </blockquote>
  1444. </div>
  1445. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875027408" class="indexterm"/> <code class="function">string-cursor-end</code> <em class="replaceable"><code>str</code></em></p>
  1446. <div class="blockquote">
  1447. <blockquote class="blockquote">
  1448. <p>Returns a cursor for the end of the string - one past the last valid character.
  1449. Implemented as <code class="literal">(as string-cursor (invoke <em class="replaceable"><code>str</code></em> 'length))</code>.
  1450. </p>
  1451. </blockquote>
  1452. </div>
  1453. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875023136" class="indexterm"/> <code class="function">string-cursor-ref</code> <em class="replaceable"><code>str</code></em> <em class="replaceable"><code>cursor</code></em></p>
  1454. <div class="blockquote">
  1455. <blockquote class="blockquote">
  1456. <p>Return the <code class="literal">character</code> at the <em class="replaceable"><code>cursor</code></em>.
  1457. If the <em class="replaceable"><code>cursor</code></em> points to the second <code class="literal">char</code> of a surrogate pair,
  1458. returns <code class="literal">#\ignorable-char</code>.
  1459. </p>
  1460. </blockquote>
  1461. </div>
  1462. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875017152" class="indexterm"/> <code class="function">string-cursor-next</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>cursor</code></em> [<em class="replaceable"><code>count</code></em>]</p>
  1463. <div class="blockquote">
  1464. <blockquote class="blockquote">
  1465. <p>Return the cursor position <em class="replaceable"><code>count</code></em> (default 1) character
  1466. positions forwards beyond <em class="replaceable"><code>cursor</code></em>.
  1467. For each <em class="replaceable"><code>count</code></em> this may add either 1 or 2
  1468. (if pointing at a surrogate pair) to the <em class="replaceable"><code>cursor</code></em>.
  1469. </p>
  1470. </blockquote>
  1471. </div>
  1472. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875010960" class="indexterm"/> <code class="function">string-cursor-next-quiet</code> <em class="replaceable"><code>cursor</code></em></p>
  1473. <div class="blockquote">
  1474. <blockquote class="blockquote">
  1475. <p>Increment cursor by one raw <code class="literal">char</code> position,
  1476. even if <em class="replaceable"><code>cursor</code></em> points to the start of a surrogate pair.
  1477. (In that case the next <code class="literal">string-cursor-ref</code> will
  1478. return <code class="literal">#\ignorable-char</code>.)
  1479. Same as <code class="literal">(+ <em class="replaceable"><code>cursor</code></em> 1)</code> but with the <code class="literal">string-cursor</code> type.
  1480. </p>
  1481. </blockquote>
  1482. </div>
  1483. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667875004416" class="indexterm"/> <code class="function">string-cursor-prev</code> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>cursor</code></em> [<em class="replaceable"><code>count</code></em>]</p>
  1484. <div class="blockquote">
  1485. <blockquote class="blockquote">
  1486. <p>Return the cursor position <em class="replaceable"><code>count</code></em> (default 1) character
  1487. positions backwards before <em class="replaceable"><code>cursor</code></em>.
  1488. </p>
  1489. </blockquote>
  1490. </div>
  1491. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874999168" class="indexterm"/> <code class="function">substring-cursor</code> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> [<em class="replaceable"><code>end</code></em>]]</p>
  1492. <div class="blockquote">
  1493. <blockquote class="blockquote">
  1494. <p>Create a substring of the section of <em class="replaceable"><code>string</code></em>
  1495. between the cursors <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>.
  1496. </p>
  1497. </blockquote>
  1498. </div>
  1499. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874993568" class="indexterm"/> <code class="function">string-cursor&lt;?</code> <em class="replaceable"><code>cursor1</code></em> <em class="replaceable"><code>cursor2</code></em></p>
  1500. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874990288" class="indexterm"/> <code class="function">string-cursor&lt;=?</code> <em class="replaceable"><code>cursor1</code></em> <em class="replaceable"><code>cursor2</code></em></p>
  1501. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874987008" class="indexterm"/> <code class="function">string-cursor=?</code> <em class="replaceable"><code>cursor1</code></em> <em class="replaceable"><code>cursor2</code></em></p>
  1502. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874983760" class="indexterm"/> <code class="function">string-cursor&gt;=?</code> <em class="replaceable"><code>cursor1</code></em> <em class="replaceable"><code>cursor2</code></em></p>
  1503. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874980480" class="indexterm"/> <code class="function">string-cursor&gt;?</code> <em class="replaceable"><code>cursor1</code></em> <em class="replaceable"><code>cursor2</code></em></p>
  1504. <div class="blockquote">
  1505. <blockquote class="blockquote">
  1506. <p>Is the position of <em class="replaceable"><code>cursor1</code></em> respectively before,
  1507. before or same, same, after, or after or same, as <em class="replaceable"><code>cursor2</code></em>.
  1508. </p>
  1509. <p><span class="emphasis"><em>Performance note:</em></span> Implemented as the corresponding <code class="literal">int</code> comparison.
  1510. </p>
  1511. </blockquote>
  1512. </div>
  1513. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667874974160" class="indexterm"/> <code class="function">string-cursor-for-each</code> <em class="replaceable"><code>proc</code></em> <em class="replaceable"><code>string</code></em> [<em class="replaceable"><code>start</code></em> [<em class="replaceable"><code>end</code></em>]]</p>
  1514. <div class="blockquote">
  1515. <blockquote class="blockquote">
  1516. <p>Apply the procedure <em class="replaceable"><code>proc</code></em> to each character position in
  1517. <em class="replaceable"><code>string</code></em> between the cursors <em class="replaceable"><code>start</code></em> and <em class="replaceable"><code>end</code></em>.
  1518. </p>
  1519. </blockquote>
  1520. </div>
  1521. </section>
  1522. </section>
  1523. <footer>
  1524. <div class="navfooter">
  1525. <ul>
  1526. <li>
  1527. <b class="toc">
  1528. <a href="Strings.xhtml#idm139667875762032">Basic string procedures</a>
  1529. </b>
  1530. </li>
  1531. <li>
  1532. <b class="toc">
  1533. <a href="Strings.xhtml#idm139667875704704">Immutable String Constructors</a>
  1534. </b>
  1535. </li>
  1536. <li>
  1537. <b class="toc">
  1538. <a href="Strings.xhtml#idm139667875652960">Selection</a>
  1539. </b>
  1540. </li>
  1541. <li>
  1542. <b class="toc">
  1543. <a href="Strings.xhtml#idm139667875592560">String Comparisons</a>
  1544. </b>
  1545. </li>
  1546. <li>
  1547. <b class="toc">
  1548. <a href="Strings.xhtml#idm139667875526960">Conversions</a>
  1549. </b>
  1550. </li>
  1551. <li>
  1552. <b class="toc">
  1553. <a href="Strings.xhtml#idm139667875457824">Searching and matching</a>
  1554. </b>
  1555. </li>
  1556. <li>
  1557. <b class="toc">
  1558. <a href="Strings.xhtml#idm139667875357872">Concatenation and replacing</a>
  1559. </b>
  1560. </li>
  1561. <li>
  1562. <b class="toc">
  1563. <a href="Strings.xhtml#idm139667875295264">Mapping and folding</a>
  1564. </b>
  1565. </li>
  1566. <li>
  1567. <b class="toc">
  1568. <a href="Strings.xhtml#idm139667875193520">Replication &amp; splitting</a>
  1569. </b>
  1570. </li>
  1571. <li>
  1572. <b class="toc">
  1573. <a href="Strings.xhtml#idm139667875144736">String mutation</a>
  1574. </b>
  1575. </li>
  1576. <li>
  1577. <b class="toc">
  1578. <a href="Strings.xhtml#idm139667875071808">Strings as sequences</a>
  1579. </b>
  1580. </li>
  1581. <li>
  1582. <b class="toc">
  1583. <a href="Strings.xhtml#idm139667875043024">String Cursor API</a>
  1584. </b>
  1585. </li>
  1586. </ul>
  1587. <p>
  1588. Up: <a accesskey="u" href="Characters-and-text.xhtml">Characters and text</a></p>
  1589. <p>
  1590. Previous: <a accesskey="p" href="Character-sets.xhtml">Character sets</a></p>
  1591. <p>
  1592. Next: <a accesskey="n" href="String-literals.xhtml">String literals</a></p>
  1593. </div>
  1594. </footer>
  1595. </body>
  1596. </html>