Tweaks
This commit is contained in:
parent
a69444f085
commit
c18e9dd1fe
|
@ -67,25 +67,61 @@ documents to directly comprise a sequence of multiple values.
|
||||||
No changes to [the Preserves semantic model](preserves.html) are made.
|
No changes to [the Preserves semantic model](preserves.html) are made.
|
||||||
Every Preserves text-syntax term is a valid P-expression, but in general
|
Every Preserves text-syntax term is a valid P-expression, but in general
|
||||||
P-expressions must be rewritten or otherwise interpreted before a
|
P-expressions must be rewritten or otherwise interpreted before a
|
||||||
meaningful Preserves value can be arrived at.
|
meaningful Preserves value can be arrived at ([see
|
||||||
|
below](#reading-preserves)).
|
||||||
|
|
||||||
## Encoding P-expressions as Preserves
|
## <a id="encoding-pexprs"></a>Encoding P-expressions as Preserves
|
||||||
|
|
||||||
|
We write ⌜*p*⌝ for the encoding into Preserves of P-expression *p*.
|
||||||
|
|
||||||
|
{:.pseudocode.equations}
|
||||||
|
| ⌜·⌝ | : | **P-expression** ⟶ **Preserves** |
|
||||||
|
|
||||||
Aside from the special classes `Group`, `Block`, `Comma`, `Semicolon` or
|
Aside from the special classes `Group`, `Block`, `Comma`, `Semicolon` or
|
||||||
`Colons`, P-expressions are directly encodable as Preserves data. All
|
`Colons`, P-expressions are encoded directly as Preserves data.
|
||||||
members of the special classes are encoded as Preserves text
|
|
||||||
`Dictionary`[^encoding-rationale] values:
|
{:.pseudocode.equations}
|
||||||
|
| ⌜`[`*p* ...`]`⌝ | = | `[`⌜*p*⌝ ...`]` |
|
||||||
|
| ⌜`<`*p* ...`>`⌝ | = | `<`⌜*p*⌝ ...`>` |
|
||||||
|
| ⌜`#{`*p* ...`}`⌝ | = | `#{`⌜*p*⌝ ...`}` |
|
||||||
|
| ⌜`#!`*p*⌝ | = | `#!`⌜*p*⌝ |
|
||||||
|
| ⌜`@`*p* *q*⌝ | = | `@`⌜*p*⌝ ⌜*q*⌝ |
|
||||||
|
| ⌜*p*⌝ | = | *p* **when** *p* ∈ **Atom** |
|
||||||
|
|
||||||
|
All members of the special classes are encoded as Preserves text
|
||||||
|
`Dictionary`[^encoding-rationale] values.
|
||||||
|
|
||||||
[^encoding-rationale]: In principle, it would be nice to use *records*
|
[^encoding-rationale]: In principle, it would be nice to use *records*
|
||||||
for this purpose, but if we did so we would have to also encode
|
for this purpose, but if we did so we would have to also encode
|
||||||
usages of records!
|
usages of records!
|
||||||
|
|
||||||
{:.pseudocode}
|
{:.pseudocode.equations}
|
||||||
> ⌜`(`*p* ...`)`⌝ ⟶ `{g:[`⌜*p*⌝ ...`]}`
|
| ⌜`(`*p* ...`)`⌝ | = | `{g:[`⌜*p*⌝ ...`]}` |
|
||||||
> ⌜`{`*p* ...`}`⌝ ⟶ `{b:[`⌜*p*⌝ ...`]}`
|
| ⌜`{`*p* ...`}`⌝ | = | `{b:[`⌜*p*⌝ ...`]}` |
|
||||||
> ⌜`,`⌝ ⟶ `{s:|,|}`
|
| ⌜`,`⌝ | = | `{s:|,|}` |
|
||||||
> ⌜`;`⌝ ⟶ `{s:|;|}`
|
| ⌜`;`⌝ | = | `{s:|;|}` |
|
||||||
> ⌜`:` ...⌝ ⟶ `{s:|:` ...`|}`
|
| ⌜`:` ...⌝ | = | `{s:|:` ...`|}` |
|
||||||
|
|
||||||
|
## <a id="reading-preserves"></a>Interpreting P-expressions as Preserves
|
||||||
|
|
||||||
|
The [previous section](#encoding-pexprs) discussed ways of representing
|
||||||
|
P-expressions using Preserves. Here, we discuss *interpreting*
|
||||||
|
P-expressions *as* Preserves, so that (1) a Preserves datum (2) written
|
||||||
|
using Preserves text syntax and then (3) read as a P-expression can be
|
||||||
|
(4) interpreted from that P-expression to yield the original datum.
|
||||||
|
|
||||||
|
A reader for P-expressions can be adapted to yield a reader for
|
||||||
|
Preserves terms by processing (subterms of) each P-expression that the
|
||||||
|
reader produces. The only subterms that need processing are the special
|
||||||
|
classes mentioned above.
|
||||||
|
|
||||||
|
1. Every `Group` or `Semicolon` that appears is an error.
|
||||||
|
2. Every `Colons` with two or more colons in it is an error.
|
||||||
|
3. Every `Comma` that appears is removed from its container.
|
||||||
|
4. Every `Block` must contain triplets of `Value`, `Colons` (with a
|
||||||
|
single colon), `Value`. Any `Block` not following this pattern is an
|
||||||
|
error. Each `Block` following the pattern is translated to a
|
||||||
|
`Dictionary` containing a key/value pair for each triplet.
|
||||||
|
|
||||||
## Appendix: Examples
|
## Appendix: Examples
|
||||||
|
|
||||||
|
@ -146,21 +182,6 @@ text-syntax encodings.
|
||||||
]}
|
]}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Appendix: Using a P-expression reader to read Preserves
|
|
||||||
|
|
||||||
A reader for P-expressions can be adapted to yield a reader for
|
|
||||||
Preserves terms by processing (subterms of) each P-expression that the
|
|
||||||
reader produces. The only subterms that need processing are the special
|
|
||||||
classes mentioned above.
|
|
||||||
|
|
||||||
1. Every `Group` or `Semicolon` that appears is an error.
|
|
||||||
2. Every `Colons` with two or more colons in it is an error.
|
|
||||||
3. Every `Comma` that appears is removed from its container.
|
|
||||||
4. Every `Block` must contain triplets of `Value`, `Colons` (with a
|
|
||||||
single colon), `Value`. Any `Block` not following this pattern is an
|
|
||||||
error. Each `Block` following the pattern is translated to a
|
|
||||||
`Dictionary` containing a key/value pair for each triplet.
|
|
||||||
|
|
||||||
## Appendix: Reading vs. Parsing
|
## Appendix: Reading vs. Parsing
|
||||||
|
|
||||||
Lisp systems first *read* streams of bytes into S-expressions and then
|
Lisp systems first *read* streams of bytes into S-expressions and then
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
:root {
|
:root {
|
||||||
--sans-font: "Open Sans", -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
|
--sans-font: "Open Sans", -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
|
||||||
--serif-font: palatino, "Palatino Linotype", "Palatino LT STD", "URW Palladio L", "TeX Gyre Pagella", serif;
|
--serif-font: palatino, "Palatino Linotype", "Palatino LT STD", "URW Palladio L", "TeX Gyre Pagella", serif;
|
||||||
|
--blockquote-indent: 40px;
|
||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
font-family: var(--serif-font);
|
font-family: var(--serif-font);
|
||||||
|
@ -230,6 +231,7 @@ table.postcard-grammar {
|
||||||
blockquote {
|
blockquote {
|
||||||
padding: 0.5rem 1rem;
|
padding: 0.5rem 1rem;
|
||||||
border-left: solid #4f81bd 2px;
|
border-left: solid #4f81bd 2px;
|
||||||
|
margin-left: var(--blockquote-indent);
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
blockquote :first-child {
|
blockquote :first-child {
|
||||||
|
@ -243,6 +245,10 @@ blockquote :last-child {
|
||||||
background-color: #e9f0f9;
|
background-color: #e9f0f9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.equations { width: auto; margin-left: var(--blockquote-indent); }
|
||||||
|
table.equations tr > *:nth-child(1) { text-align: right; }
|
||||||
|
table.equations tr > *:nth-child(2) { text-align: center; }
|
||||||
|
|
||||||
blockquote.pseudocode {
|
blockquote.pseudocode {
|
||||||
border-left: none;
|
border-left: none;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
Loading…
Reference in New Issue