String-literals.xhtml 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  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>String literals</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="Strings.xhtml" title="Strings"/>
  10. <link rel="next" href="Unicode.xhtml" title="Unicode character classes and conversions"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="String literals" epub:type="subchapter" id="String-literals">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">String literals</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p>Kaw support two syntaxes of string literals:
  23. The traditional, portable, qdouble-quoted-delimited literals
  24. like <code class="literal">"this"</code>;
  25. and extended SRFI-109 quasi-literals like <code class="literal">&amp;{this}</code>.
  26. </p>
  27. <section class="sect2" title="Simple string literals" epub:type="division" id="idm139667874965056">
  28. <div class="titlepage">
  29. <div>
  30. <div>
  31. <h3 class="title">Simple string literals</h3>
  32. </div>
  33. </div>
  34. </div>
  35. <div class="literallayout">
  36. <p><a id="idm139667874963984" class="indexterm"/><span id="meta-string"/><em class="replaceable"><code>string</code></em> <code class="literal">::=</code> <code class="literal"><span class="bold"><strong>"</strong></span></code><a class="link" href="String-literals.xhtml#meta-string-element"><em class="replaceable"><code>string-element</code></em></a><sup>*</sup><code class="literal"><span class="bold"><strong>"</strong></span></code><br/>
  37. <a id="idm139667874959552" class="indexterm"/><span id="meta-string-element"/><em class="replaceable"><code>string-element</code></em> <code class="literal">::=</code> <span class="emphasis"><em>any character other than</em></span> <code class="literal"><span class="bold"><strong>"</strong></span></code> <span class="emphasis"><em>or</em></span> <code class="literal"><span class="bold"><strong>\</strong></span></code><br/>
  38.     | <a class="link" href="String-literals.xhtml#meta-mnemonic-escape"><em class="replaceable"><code>mnemonic-escape</code></em></a> | <code class="literal"><span class="bold"><strong>\"</strong></span></code> | <code class="literal"><span class="bold"><strong>\\</strong></span></code><br/>
  39.     | <code class="literal"><span class="bold"><strong>\</strong></span></code><a class="link" href="Lexical-syntax.xhtml#meta-intraline-whitespace"><em class="replaceable"><code>intraline-whitespace</code></em></a><sup>*</sup><a class="link" href="Lexical-syntax.xhtml#meta-line-ending"><em class="replaceable"><code>line-ending</code></em></a> <a class="link" href="Lexical-syntax.xhtml#meta-intraline-whitespace"><em class="replaceable"><code>intraline-whitespace</code></em></a><sup>*</sup><br/>
  40.     | <a class="link" href="Lexical-syntax.xhtml#meta-inline-hex-escape"><em class="replaceable"><code>inline-hex-escape</code></em></a><br/>
  41. <a id="idm139667874948208" class="indexterm"/><span id="meta-mnemonic-escape"/><em class="replaceable"><code>mnemonic-escape</code></em> <code class="literal">::=</code> <code class="literal"><span class="bold"><strong>\a</strong></span></code> | <code class="literal"><span class="bold"><strong>\b</strong></span></code> | <code class="literal"><span class="bold"><strong>\t</strong></span></code> | <code class="literal"><span class="bold"><strong>\n</strong></span></code> | <code class="literal"><span class="bold"><strong>\r</strong></span></code> | ... <span class="emphasis"><em>(see below)</em></span><br/>
  42. </p>
  43. </div>
  44. <p>A string is written as a sequence of characters enclosed
  45. within quotation marks (<code class="literal"><span class="bold"><strong>"</strong></span></code>).
  46. Within a string literal, various escape sequence represent characters
  47. other than themselves.
  48. Escape sequences always start with a backslash (<code class="literal"><span class="bold"><strong>\</strong></span></code>):
  49. </p>
  50. <div class="variablelist" epub:type="list">
  51. <dl class="variablelist">
  52. <dt class="term"><code class="literal"><span class="bold"><strong>\a</strong></span></code>
  53. </dt>
  54. <dd>
  55. <p>Alarm (bell), <code class="literal">#\x0007</code>.
  56. </p>
  57. </dd>
  58. <dt class="term"><code class="literal"><span class="bold"><strong>\b</strong></span></code>
  59. </dt>
  60. <dd>
  61. <p>Backspace, <code class="literal">#\x0008</code>.
  62. </p>
  63. </dd>
  64. <dt class="term"><code class="literal"><span class="bold"><strong>\e</strong></span></code>
  65. </dt>
  66. <dd>
  67. <p>Escape, <code class="literal">#\x001B</code>.
  68. </p>
  69. </dd>
  70. <dt class="term"><code class="literal"><span class="bold"><strong>\f</strong></span></code>
  71. </dt>
  72. <dd>
  73. <p>Form feed, <code class="literal">#\x000C</code>.
  74. </p>
  75. </dd>
  76. <dt class="term"><code class="literal"><span class="bold"><strong>\n</strong></span></code>
  77. </dt>
  78. <dd>
  79. <p>Linefeed (newline), <code class="literal">#\x000A</code>.
  80. </p>
  81. </dd>
  82. <dt class="term"><code class="literal"><span class="bold"><strong>\r</strong></span></code>
  83. </dt>
  84. <dd>
  85. <p>Return, <code class="literal">#\x000D</code>.
  86. </p>
  87. </dd>
  88. <dt class="term"><code class="literal"><span class="bold"><strong>\t</strong></span></code>
  89. </dt>
  90. <dd>
  91. <p>Character tabulation, <code class="literal">#\x0009</code>.
  92. </p>
  93. </dd>
  94. <dt class="term"><code class="literal"><span class="bold"><strong>\v</strong></span></code>
  95. </dt>
  96. <dd>
  97. <p>Vertical tab, <code class="literal">#\x000B</code>.
  98. </p>
  99. </dd>
  100. <dt class="term"><code class="literal"><span class="bold"><strong>\C-</strong></span></code><em class="replaceable"><code>x</code></em>
  101. </dt>
  102. <dt class="term"><code class="literal"><span class="bold"><strong>\^</strong></span></code><em class="replaceable"><code>x</code></em>
  103. </dt>
  104. <dd>
  105. <p>Returns the scalar value of <em class="replaceable"><code>x</code></em> masked (anded) with <code class="literal">#x9F</code>.
  106. An alternative way to write the Ascii control characters:
  107. For example <code class="literal">"\C-m"</code> or <code class="literal">"\^m"</code> is
  108. the same as <code class="literal">"#\x000D"</code> (which the same as <code class="literal">"\r"</code>).
  109. As a special case <code class="literal">\^?</code> is rubout (delete) (<code class="literal">\x7f;</code>).
  110. </p>
  111. </dd>
  112. <dt class="term"><code class="literal"><span class="bold"><strong>\x</strong></span></code> <a class="link" href="Lexical-syntax.xhtml#meta-hex-scalar-value"><em class="replaceable"><code>hex-scalar-value</code></em></a><code class="literal"><span class="bold"><strong>;</strong></span></code>
  113. </dt>
  114. <dt class="term"><code class="literal"><span class="bold"><strong>\X</strong></span></code> <a class="link" href="Lexical-syntax.xhtml#meta-hex-scalar-value"><em class="replaceable"><code>hex-scalar-value</code></em></a><code class="literal"><span class="bold"><strong>;</strong></span></code>
  115. </dt>
  116. <dd>
  117. <p>A hex encoding that gives the scalar value of a character.
  118. </p>
  119. </dd>
  120. <dt class="term"><code class="literal"><span class="bold"><strong>\\</strong></span></code> <a class="link" href="Lexical-syntax.xhtml#meta-oct-digit"><em class="replaceable"><code>oct-digit</code></em></a><sup>+</sup>
  121. </dt>
  122. <dd>
  123. <p>At most three octal digits that give the scalar value of a character.
  124. (Historical, for C compatibility.)
  125. </p>
  126. </dd>
  127. <dt class="term"><code class="literal"><span class="bold"><strong>\u</strong></span></code> <a class="link" href="Lexical-syntax.xhtml#meta-hex-digit"><em class="replaceable"><code>hex-digit</code></em></a><sup>+</sup>
  128. </dt>
  129. <dd>
  130. <p>Exactly four hex digits that give the scalar value of a character.
  131. (Historical, for Java compatibility.)
  132. </p>
  133. </dd>
  134. <dt class="term"><code class="literal"><span class="bold"><strong>\M-</strong></span></code><em class="replaceable"><code>x</code></em>
  135. </dt>
  136. <dd>
  137. <p>(Historical, for Emacs Lisp.)
  138. Set the meta-bit (high-bit of single byte) of the following character <em class="replaceable"><code>x</code></em>.
  139. </p>
  140. </dd>
  141. <dt class="term"><code class="literal"><span class="bold"><strong>\|</strong></span></code>
  142. </dt>
  143. <dd>
  144. <p>Vertical line, <code class="literal">#\x007c</code>.
  145. (Not useful for string literals, but useful for symbols.)
  146. </p>
  147. </dd>
  148. <dt class="term"><code class="literal"><span class="bold"><strong>\"</strong></span></code>
  149. </dt>
  150. <dd>
  151. <p>Double quote, <code class="literal">#\x0022</code>.
  152. </p>
  153. </dd>
  154. <dt class="term"><code class="literal"><span class="bold"><strong>\\</strong></span></code>
  155. </dt>
  156. <dd>
  157. <p>Backslah, <code class="literal">#\005C</code>.
  158. </p>
  159. </dd>
  160. <dt class="term"><code class="literal"><span class="bold"><strong>\</strong></span></code><a class="link" href="Lexical-syntax.xhtml#meta-intraline-whitespace"><em class="replaceable"><code>intraline-whitespace</code></em></a><sup>*</sup><a class="link" href="Lexical-syntax.xhtml#meta-line-ending"><em class="replaceable"><code>line-ending</code></em></a> <a class="link" href="Lexical-syntax.xhtml#meta-intraline-whitespace"><em class="replaceable"><code>intraline-whitespace</code></em></a><sup>*</sup>
  161. </dt>
  162. <dd>
  163. <p>Nothing (ignored). Allows you to split up a long string over multiple
  164. lines; ignoring initial whitespace on the continuation lines allows
  165. you to indent them.
  166. </p>
  167. </dd>
  168. </dl>
  169. </div>
  170. <p>Except for a line ending, any character outside of an escape
  171. sequence stands for itself in the string literal. A line ending
  172. which is preceded by <code class="literal"><span class="bold"><strong>\</strong></span></code><em class="replaceable"><code>intraline-whitespace</code></em><sup>*</sup>
  173. expands to nothing (along with any trailing <em class="replaceable"><code>intraline-whitespace</code></em>),
  174. and can be used to indent strings for improved legibility.
  175. Any other line ending has the same effect as inserting a <code class="literal"><span class="bold"><strong>\n</strong></span></code>
  176. character into the string.
  177. </p>
  178. <p>Examples:
  179. </p>
  180. <pre class="screen">"The word \"recursion\" has many meanings."
  181. "Another example:\ntwo lines of text"
  182. "Here’s text \
  183. containing just one line"
  184. "\x03B1; is named GREEK SMALL LETTER ALPHA."
  185. </pre>
  186. <span id="string-quasi-literals"/>
  187. </section>
  188. <section class="sect2" title="String templates" epub:type="division" id="idm139667874889552">
  189. <div class="titlepage">
  190. <div>
  191. <div>
  192. <h3 class="title">String templates</h3>
  193. </div>
  194. </div>
  195. </div>
  196. <p>The following syntax is a <em class="firstterm">string template</em> (also called
  197. a string quasi-literal or
  198. “<a class="ulink" href="http://en.wikipedia.org/wiki/Here_document" target="_top">here document</a>”):
  199. </p>
  200. <pre class="screen">&amp;{Hello &amp;[name]!}
  201. </pre>
  202. <p>Assuming the variable <code class="literal">name</code> evaluates to <code class="literal">"John"</code>
  203. then the example evaluates to <code class="literal">"Hello John!"</code>.
  204. </p>
  205. <p>The Kawa reader converts the above example to:
  206. </p>
  207. <pre class="screen">($string$ "Hello " $&lt;&lt;$ name $&gt;&gt;$ "!")
  208. </pre>
  209. <p>See the <a class="ulink" href="http://srfi.schemers.org/srfi-109/srfi-109.html" target="_top">SRFI-109</a>
  210. specification for details.
  211. </p>
  212. <div class="literallayout">
  213. <p><a id="idm139667874882992" class="indexterm"/><span id="meta-extended-string-literal"/><em class="replaceable"><code>extended-string-literal</code></em> <code class="literal">::=</code> <code class="literal"><span class="bold"><strong>&amp;{</strong></span></code> [<a class="link" href="String-literals.xhtml#meta-initial-ignored"><em class="replaceable"><code>initial-ignored</code></em></a>] <a class="link" href="String-literals.xhtml#meta-string-literal-part"><em class="replaceable"><code>string-literal-part</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>}</strong></span></code><br/>
  214. <a id="idm139667874877456" class="indexterm"/><span id="meta-string-literal-part"/><em class="replaceable"><code>string-literal-part</code></em> <code class="literal">::=</code>  <span class="emphasis"><em>any character except</em></span> <code class="literal"><span class="bold"><strong>&amp;</strong></span></code>, <code class="literal"><span class="bold"><strong>{</strong></span></code> <span class="emphasis"><em>or</em></span> <code class="literal"><span class="bold"><strong>}</strong></span></code><br/>
  215.     | <code class="literal"><span class="bold"><strong>{</strong></span></code> <a class="link" href="String-literals.xhtml#meta-string-literal-part"><em class="replaceable"><code>string-literal-part</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>}</strong></span></code><br/>
  216.     | <a class="link" href="String-literals.xhtml#meta-char-ref"><em class="replaceable"><code>char-ref</code></em></a><br/>
  217.     | <a class="link" href="String-literals.xhtml#meta-entity-ref"><em class="replaceable"><code>entity-ref</code></em></a><br/>
  218.     | <a class="link" href="String-literals.xhtml#meta-special-escape"><em class="replaceable"><code>special-escape</code></em></a><br/>
  219.     | <a class="link" href="String-literals.xhtml#meta-enclosed-part"><em class="replaceable"><code>enclosed-part</code></em></a><br/>
  220. </p>
  221. </div>
  222. <p>You can use the plain <code class="literal">"<em class="replaceable"><code>string</code></em>"</code> syntax for
  223. longer multiline strings, but <code class="literal">&amp;{<em class="replaceable"><code>string</code></em>}</code> has
  224. various advantages.
  225. The syntax is less error-prone because the start-delimiter is
  226. different from the end-delimiter. Also note that nested braces
  227. are allowed: a right brace <code class="literal">}</code> is only an end-delimiter
  228. if it is unbalanced, so you would seldom need to escape it:
  229. </p>
  230. <pre class="screen">&amp;{This has a {braced} section.}
  231. ⇒ "This has a {braced} section."
  232. </pre>
  233. <p>The escape character used for special characters is
  234. <code class="literal"><span class="bold"><strong>&amp;</strong></span></code>. This is compatible with XML syntax and <a class="link" href="XML-literals.xhtml" title="XML literals">XML literals</a>.
  235. </p>
  236. <section class="sect3" title="Special characters" epub:type="division" id="idm139667874860704">
  237. <div class="titlepage">
  238. <div>
  239. <div>
  240. <h4 class="title">Special characters</h4>
  241. </div>
  242. </div>
  243. </div>
  244. <div class="literallayout">
  245. <p><a id="idm139667874859632" class="indexterm"/><span id="meta-char-ref"/><em class="replaceable"><code>char-ref</code></em> <code class="literal">::=</code><br/>
  246.     <code class="literal"><span class="bold"><strong>&amp;#</strong></span></code> <a class="link" href="Lexical-syntax.xhtml#meta-digit"><em class="replaceable"><code>digit</code></em></a><sup>+</sup> <code class="literal"><span class="bold"><strong>;</strong></span></code><br/>
  247.   | <code class="literal"><span class="bold"><strong>&amp;#x</strong></span></code> <a class="link" href="Lexical-syntax.xhtml#meta-hex-digit"><em class="replaceable"><code>hex-digit</code></em></a><sup>+</sup>  <code class="literal"><span class="bold"><strong>;</strong></span></code><br/>
  248. <a id="idm139667874852272" class="indexterm"/><span id="meta-entity-ref"/><em class="replaceable"><code>entity-ref</code></em> <code class="literal">::=</code><br/>
  249.     <code class="literal"><span class="bold"><strong>&amp;</strong></span></code> <a class="link" href="String-literals.xhtml#meta-char-or-entity-name"><em class="replaceable"><code>char-or-entity-name</code></em></a> <code class="literal"><span class="bold"><strong>;</strong></span></code><br/>
  250. <a id="idm139667874847856" class="indexterm"/><span id="meta-char-or-entity-name"/><em class="replaceable"><code>char-or-entity-name</code></em> <code class="literal">::=</code> <em class="replaceable"><code>tagname</code></em><br/>
  251. </p>
  252. </div>
  253. <p>You can the standard XML syntax for character references, using
  254. either decimal or hexadecimal values. The following string has two
  255. instances of the Ascii escape character, as either decimal 27 or hex 1B:
  256. </p>
  257. <pre class="screen">&amp;{&amp;#27;&amp;#x1B;} ⇒ "\e\e"
  258. </pre>
  259. <p>You can also use the pre-defined XML entity names:
  260. </p>
  261. <pre class="screen">&amp;{&amp;amp; &amp;lt; &amp;gt; &amp;quot; &amp;apos;} ⇒ "&amp; &lt; &gt; \" '"
  262. </pre>
  263. <p>In addition, <code class="literal">&amp;lbrace;</code> <code class="literal">&amp;rbrace;</code> can be used for left and
  264. right curly brace, though you don’t need them for balanced parentheses:
  265. </p>
  266. <pre class="screen">&amp;{ &amp;rbrace;_&amp;lbrace; / {_} } ⇒ " }_{ / {_} "
  267. </pre>
  268. <p>You can use the <a class="ulink" href="http://www.w3.org/2003/entities/2007/w3centities-f.ent" target="_top">standard XML entity names</a>. For example:
  269. </p>
  270. <pre class="screen">&amp;{L&amp;aelig;rdals&amp;oslash;yri}
  271. ⇒ "Lærdalsøyri"
  272. </pre>
  273. <p>You can also use the standard R7RS character names <code class="literal">null</code>,
  274. <code class="literal">alarm</code>, <code class="literal">backspace</code>, <code class="literal">tab</code>, <code class="literal">newline</code>, <code class="literal">return</code>,
  275. <code class="literal">escape</code>, <code class="literal">space</code>, and <code class="literal">delete</code>.
  276. For example:
  277. </p>
  278. <pre class="screen">&amp;{&amp;escape;&amp;space;}
  279. </pre>
  280. <p>The syntax <code class="literal">&amp;<em class="replaceable"><code>name</code></em>;</code> is actually syntactic sugar
  281. (specifically reader syntax) to the variable reference
  282. <code class="literal">$entity$:<em class="replaceable"><code>name</code></em></code>.
  283. Hence you can also define your own entity names:
  284. </p>
  285. <pre class="screen">(define $entity$:crnl "\r\n")
  286. &amp;{&amp;crnl;} ⟹ "\r\n"
  287. </pre>
  288. </section>
  289. <section class="sect3" title="Multiline string literals" epub:type="division" id="idm139667874833328">
  290. <div class="titlepage">
  291. <div>
  292. <div>
  293. <h4 class="title">Multiline string literals</h4>
  294. </div>
  295. </div>
  296. </div>
  297. <pre class="screen"><a id="idm139667874832240" class="indexterm"/><span id="meta-initial-ignored"/><em class="replaceable"><code>initial-ignored</code></em> <code class="literal">::=</code>
  298. <a class="link" href="Lexical-syntax.xhtml#meta-intraline-whitespace"><em class="replaceable"><code>intraline-whitespace</code></em></a><sup>*</sup> <a class="link" href="Lexical-syntax.xhtml#meta-line-ending"><em class="replaceable"><code>line-ending</code></em></a> <a class="link" href="Lexical-syntax.xhtml#meta-intraline-whitespace"><em class="replaceable"><code>intraline-whitespace</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>&amp;|</strong></span></code>
  299. <a id="idm139667874826448" class="indexterm"/><span id="meta-special-escape"/><em class="replaceable"><code>special-escape</code></em> <code class="literal">::=</code>
  300. <a class="link" href="Lexical-syntax.xhtml#meta-intraline-whitespace"><em class="replaceable"><code>intraline-whitespace</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>&amp;|</strong></span></code>
  301. | <code class="literal"><span class="bold"><strong>&amp;</strong></span></code> <a class="link" href="Lexical-syntax.xhtml#meta-nested-comment"><em class="replaceable"><code>nested-comment</code></em></a>
  302. | <code class="literal"><span class="bold"><strong>&amp;-</strong></span></code> <a class="link" href="Lexical-syntax.xhtml#meta-intraline-whitespace"><em class="replaceable"><code>intraline-whitespace</code></em></a><sup>*</sup> <a class="link" href="Lexical-syntax.xhtml#meta-line-ending"><em class="replaceable"><code>line-ending</code></em></a>
  303. </pre>
  304. <p>A line-ending directly in the text is becomes a newline,
  305. as in a simple string literal:
  306. </p>
  307. <pre class="screen">(string-capitalize &amp;{one two three
  308. uno dos tres
  309. }) ⇒ "One Two Three\nUno Dos Tres\n"
  310. </pre>
  311. <p>However, you have extra control over layout.
  312. If the string is in a nested expression, it is confusing
  313. (and ugly) if the string cannot be indented to match
  314. the surrounding context. The indentation marker <code class="literal"><span class="bold"><strong>&amp;|</strong></span></code>
  315. is used to mark the end of insignificant initial whitespace.
  316. The <code class="literal">&amp;|</code> characters and all the preceding whitespace are removed.
  317. In addition, it also suppresses an initial newline. Specifically,
  318. when the initial left-brace is followed by optional (invisible)
  319. intraline-whitespace, then a newline, then optional
  320. intraline-whitespace (the indentation), and finally the indentation
  321. marker <code class="literal">&amp;|</code> - all of which is removed from the output.
  322. Otherwise the <code class="literal">&amp;|</code> only removes initial intraline-whitespace
  323. on the same line (and itself).
  324. </p>
  325. <pre class="screen">(write (string-capitalize &amp;{
  326. &amp;|one two three
  327. &amp;|uno dos tres
  328. }) out)
  329. ⇒ <span class="emphasis"><em>prints</em></span> "One Two Three\nUno Dos Tres\n"
  330. </pre>
  331. <p>As a matter of style, all of the indentation lines should line up.
  332. It is an error if there are any non-whitespace characters between
  333. the previous newline and the indentation marker.
  334. It is also an error to write an indentation marker before the
  335. first newline in the literal.
  336. </p>
  337. <p>The line-continuation marker <code class="literal"><span class="bold"><strong>&amp;-</strong></span></code> is used to suppress a newline:
  338. </p>
  339. <pre class="screen">&amp;{abc&amp;-
  340. def} ⇒ "abc def"
  341. </pre>
  342. <p>You can write a <code class="literal">#|...|#</code>-style comment following a <code class="literal">&amp;</code>.
  343. This could be useful for annotation, or line numbers:
  344. </p>
  345. <pre class="screen">&amp;{&amp;#|line 1|#one two
  346. &amp;#|line 2|# three
  347. &amp;#|line 3|#uno dos tres
  348. } ⇒ "one two\n three\nuno dos tres\n"
  349. </pre>
  350. </section>
  351. <section class="sect3" title="Embedded expressions" epub:type="division" id="idm139667874808736">
  352. <div class="titlepage">
  353. <div>
  354. <div>
  355. <h4 class="title">Embedded expressions</h4>
  356. </div>
  357. </div>
  358. </div>
  359. <pre class="screen"><a id="idm139667874807664" class="indexterm"/><span id="meta-enclosed-part"/><em class="replaceable"><code>enclosed-part</code></em> <code class="literal">::=</code>
  360. <code class="literal"><span class="bold"><strong>&amp;</strong></span></code> <a class="link" href="String-literals.xhtml#meta-enclosed-modifier"><em class="replaceable"><code>enclosed-modifier</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>[</strong></span></code> <a class="link" href="Primitive-expression-syntax.xhtml#meta-expression"><em class="replaceable"><code>expression</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>]</strong></span></code>
  361. | <code class="literal"><span class="bold"><strong>&amp;</strong></span></code> <a class="link" href="String-literals.xhtml#meta-enclosed-modifier"><em class="replaceable"><code>enclosed-modifier</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>(</strong></span></code> <a class="link" href="Primitive-expression-syntax.xhtml#meta-expression"><em class="replaceable"><code>expression</code></em></a><sup>+</sup> <code class="literal"><span class="bold"><strong>)</strong></span></code>
  362. </pre>
  363. <p>An embedded expression has the form <code class="literal">&amp;[<em class="replaceable"><code>expression</code></em>]</code>.
  364. It is evaluated, the result converted to a string (as by <code class="literal">display</code>),
  365. and the result added in the result string.
  366. (If there are multiple expressions, they are all evaluated and
  367. the corresponding strings inserted in the result.)
  368. </p>
  369. <pre class="screen">&amp;{Hello &amp;[(string-capitalize name)]!}
  370. </pre>
  371. <p>You can leave out the square brackets when the expression
  372. is a parenthesized expression:
  373. </p>
  374. <pre class="screen">&amp;{Hello &amp;(string-capitalize name)!}
  375. </pre>
  376. </section>
  377. <section class="sect3" title="Formatting" epub:type="division" id="idm139667874793168">
  378. <div class="titlepage">
  379. <div>
  380. <div>
  381. <h4 class="title">Formatting</h4>
  382. </div>
  383. </div>
  384. </div>
  385. <pre class="screen"><a id="idm139667874792096" class="indexterm"/><span id="meta-enclosed-modifier"/><em class="replaceable"><code>enclosed-modifier</code></em> <code class="literal">::=</code>
  386. <code class="literal"><span class="bold"><strong>~</strong></span></code> <em class="replaceable"><code>format-specifier-after-tilde</code></em>
  387. </pre>
  388. <p>Using <a class="link" href="Format.xhtml" title="Formatted Output (Common-Lisp-style)"><code class="literal">format</code></a> allows finer-grained control over the
  389. output, but a problem is that the association between format
  390. specifiers and data expressions is positional, which is hard-to-read
  391. and error-prone. A better solution places the specifier adjacant to
  392. the data expression:
  393. </p>
  394. <pre class="screen">&amp;{The response was &amp;~,2f(* 100.0 (/ responses total))%.}
  395. </pre>
  396. <p>The following escape forms are equivalent to the corresponding
  397. forms withput the <code class="literal"><span class="bold"><strong>~</strong></span></code><em class="replaceable"><code>fmt-spec</code></em>, except the
  398. expression(s) are formatted using <code class="literal">format</code>:
  399. </p>
  400. <div class="literallayout">
  401. <p><code class="literal"><span class="bold"><strong>&amp;~</strong></span></code><em class="replaceable"><code>fmt-spec</code></em><code class="literal"><span class="bold"><strong>[</strong></span></code><em class="replaceable"><code>expression</code></em><sup>*</sup><code class="literal"><span class="bold"><strong>]</strong></span></code> <br/>
  402. </p>
  403. </div>
  404. <p>Again using parentheses like this:
  405. </p>
  406. <div class="literallayout">
  407. <p><code class="literal"><span class="bold"><strong>&amp;~</strong></span></code><em class="replaceable"><code>fmt-spec</code></em><code class="literal"><span class="bold"><strong>(</strong></span></code><em class="replaceable"><code>expression</code></em><sup>+</sup><code class="literal"><span class="bold"><strong>)</strong></span></code><br/>
  408. </p>
  409. </div>
  410. <p>is equivalent to:
  411. </p>
  412. <div class="literallayout">
  413. <p><code class="literal"><span class="bold"><strong>&amp;~</strong></span></code><em class="replaceable"><code>fmt-spec</code></em><code class="literal"><span class="bold"><strong>[(</strong></span></code><em class="replaceable"><code>expression</code></em><sup>+</sup><code class="literal"><span class="bold"><strong>)]</strong></span></code><br/>
  414. </p>
  415. </div>
  416. <p>The syntax of <code class="literal">format</code> specifications is arcane, but it allows you
  417. to do some pretty neat things in a compact space.
  418. For example to include <code class="literal">"_"</code> between each element of
  419. the array <code class="literal">arr</code> you can use the <code class="literal">~{...~}</code> format speciers:
  420. </p>
  421. <pre class="screen">(define arr [5 6 7])
  422. &amp;{&amp;~{&amp;[arr]&amp;~^_&amp;~}} ⇒ "5_6_7"
  423. </pre>
  424. <p>If no format is specified for an enclosed expression,
  425. the that is equivalent to a <code class="literal">~a</code> format specifier,
  426. so this is equivalent to:
  427. </p>
  428. <pre class="screen">&amp;{&amp;~{&amp;~a[arr]&amp;~^_&amp;~}} ⇒ "5_6_7"
  429. </pre>
  430. <p>which is in turn equivalent to:
  431. </p>
  432. <pre class="screen">(format #f "~{~a~^_~}" arr)
  433. </pre>
  434. <p>The fine print that makes this work:
  435. If there are multiple expressions in a <code class="literal">&amp;[...]</code> with
  436. no format specifier then there is an implicit <code class="literal">~a</code> for
  437. each expression.
  438. On the other hand, if there is an explicit format specifier,
  439. it is not repeated for each enclosed expression: it appears
  440. exactly once in the effective format string, whether
  441. there are zero, one, or many expressions.
  442. </p>
  443. </section>
  444. </section>
  445. </section>
  446. <footer>
  447. <div class="navfooter">
  448. <ul>
  449. <li>
  450. <b class="toc">
  451. <a href="String-literals.xhtml#idm139667874965056">Simple string literals</a>
  452. </b>
  453. </li>
  454. <li>
  455. <b class="toc">
  456. <a href="String-literals.xhtml#idm139667874889552">String templates</a>
  457. </b>
  458. </li>
  459. </ul>
  460. <p>
  461. Up: <a accesskey="u" href="Characters-and-text.xhtml">Characters and text</a></p>
  462. <p>
  463. Previous: <a accesskey="p" href="Strings.xhtml">Strings</a></p>
  464. <p>
  465. Next: <a accesskey="n" href="Unicode.xhtml">Unicode character classes and conversions</a></p>
  466. </div>
  467. </footer>
  468. </body>
  469. </html>