Named-quasi-literals.xhtml 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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>Named quasi-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="Overall-Index.xhtml" title="Index"/>
  10. <link rel="next" href="Program-structure.xhtml" title="Program structure"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="Named quasi-literals" epub:type="subchapter" id="Named-quasi-literals">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">Named quasi-literals</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p>Traditional Scheme has only a few kinds of values,
  23. and thus only a few builtin kinds of literals.
  24. Modern Scheme allows defining new types,
  25. so it is desirable to have a mechanism for defining literal values
  26. for the new types.
  27. </p>
  28. <p>Consider the <code class="literal"><a class="link" href="Paths.xhtml#URI-type">URI</a></code> type.
  29. You can create a new instance of a <code class="literal">URI</code> using a
  30. constructor function:
  31. </p>
  32. <pre class="screen">(URI "http://example.com/")
  33. </pre>
  34. <p>This isn’t too bad, though the double-quote characters are an ugly distraction.
  35. However, if you need to construct the string it gets messy:
  36. </p>
  37. <pre class="screen">(URI (string-append base-uri "icon.png"))
  38. </pre>
  39. <p>Instead use can write:
  40. </p>
  41. <pre class="screen">&amp;URI{http://example.com/}
  42. </pre>
  43. <p>or:
  44. </p>
  45. <pre class="screen">&amp;URI{&amp;[base-uri]icon.png}
  46. </pre>
  47. <p>This syntax is translated by the Scheme reader
  48. to the more familiar but more verbose equivalent forms:
  49. </p>
  50. <pre class="screen">($construct$:URI "http://example.com/")
  51. ($construct$:URI $&lt;&lt;$ base-uri $&gt;&gt;$ "icon.png")
  52. </pre>
  53. <p>So for this to work there just needs to be a definition
  54. of <code class="literal">$construct$:URI</code>, usually a macro.
  55. Normal scope rules apply; typically you’d define <code class="literal">$construct$:URI</code> in
  56. a module.
  57. </p>
  58. <p>The names <code class="literal">$&lt;&lt;$</code> and <code class="literal">$&gt;&gt;$</code> are bound to unique zero-length strings.
  59. They are used to allow the implementation of <code class="literal">$construct$:URI</code>
  60. to determine which arguments are literal and which come from
  61. escaped expressions.
  62. </p>
  63. <p>If you want to define your own <code class="literal">$construct$:<em class="replaceable"><code>tag</code></em></code>,
  64. or to read motivation and details, see the
  65. <a class="ulink" href="http://srfi.schemers.org/srfi-108/srfi-108.html" target="_top">SRFI 108</a> specification.
  66. </p>
  67. <div class="literallayout">
  68. <p><a id="idm139667878584128" class="indexterm"/><span id="meta-extended-datum-literal"/><em class="replaceable"><code>extended-datum-literal</code></em> <code class="literal">::=</code><br/>
  69.     <code class="literal"><span class="bold"><strong>&amp;</strong></span></code> <a class="link" href="Named-quasi-literals.xhtml#meta-cname"><em class="replaceable"><code>cname</code></em></a> <code class="literal"><span class="bold"><strong>{</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="Named-quasi-literals.xhtml#meta-named-literal-part"><em class="replaceable"><code>named-literal-part</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>}</strong></span></code><br/>
  70.   | <code class="literal"><span class="bold"><strong>&amp;</strong></span></code> <a class="link" href="Named-quasi-literals.xhtml#meta-cname"><em class="replaceable"><code>cname</code></em></a> <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> [<a class="link" href="String-literals.xhtml#meta-initial-ignored"><em class="replaceable"><code>initial-ignored</code></em></a>] <a class="link" href="Named-quasi-literals.xhtml#meta-named-literal-part"><em class="replaceable"><code>named-literal-part</code></em></a><sup>*</sup> <code class="literal"><span class="bold"><strong>}</strong></span></code><br/>
  71. <a id="idm139667878569888" class="indexterm"/><span id="meta-cname"/><em class="replaceable"><code>cname</code></em> <code class="literal">::=</code> <a class="link" href="Lexical-syntax.xhtml#meta-identifier"><em class="replaceable"><code>identifier</code></em></a><br/>
  72. <a id="idm139667878567088" class="indexterm"/><span id="meta-named-literal-part"/><em class="replaceable"><code>named-literal-part</code></em> <code class="literal">::=</code><br/>
  73.     <span class="emphasis"><em>any character except</em></span> <code class="literal"><span class="bold"><strong>&amp;</strong></span></code><span class="emphasis"><em>,</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/>
  74.   | <code class="literal"><span class="bold"><strong>{</strong></span></code> <a class="link" href="Named-quasi-literals.xhtml#meta-named-literal-part"><em class="replaceable"><code>named-literal-part</code></em></a><sup>+</sup> <code class="literal"><span class="bold"><strong>}</strong></span></code><br/>
  75.   | <a class="link" href="String-literals.xhtml#meta-char-ref"><em class="replaceable"><code>char-ref</code></em></a><br/>
  76.   | <a class="link" href="String-literals.xhtml#meta-entity-ref"><em class="replaceable"><code>entity-ref</code></em></a><br/>
  77.   | <a class="link" href="String-literals.xhtml#meta-special-escape"><em class="replaceable"><code>special-escape</code></em></a><br/>
  78.   | <a class="link" href="String-literals.xhtml#meta-enclosed-part"><em class="replaceable"><code>enclosed-part</code></em></a><br/>
  79.   | <a class="link" href="Named-quasi-literals.xhtml#meta-extended-datum-literal"><em class="replaceable"><code>extended-datum-literal</code></em></a><br/>
  80. </p>
  81. </div>
  82. </section>
  83. <footer>
  84. <div class="navfooter">
  85. <p>
  86. Up: <a accesskey="u" href="Syntax.xhtml">Syntax</a></p>
  87. <p>
  88. Previous: <a accesskey="p" href="Macros.xhtml">Macros</a></p>
  89. </div>
  90. </footer>
  91. </body>
  92. </html>