1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
# Decoding
A separate process called "decoding" can transform simple data structures,
consisting of only the datum types, into a richer set of Zisp types.
For example, the decoder may turn `(#HASH ...)` into a vector, as one would
expect a vector literal like `#(...)` to work in Scheme. Bytevector syntax
could use a custom rune as a list prefix, like: `#u8(...)`
Runes may be decoded in isolation as well, rather than transforming a list
whose head they appear in. This can implement Boolean constants as `#true`
and `#false` or `#t` and `#f`.
The decoder recognizes `(#QUOTE ...)` to aid in implementing the traditional
quoting mechanism of Lisp/Scheme, but with a significant difference:
Traditional quote is "unhygienic" in Scheme terms. An expression such as
`'(foo bar)` will always be read as `(quote (foo bar))` regardless of what
lexical context it appears in, so the semantics will depend on whatever the
identifier `quote` is bound to, meaning that the expression may end up
evaluating to something other than the list `(foo bar)`.
The Zisp decoder, which transforms not datum to datum, but object to object,
can turn `#QUOTE` into an object which encapsulates the notion of quoting,
which the Zisp evaluator can recognize and act upon, ensuring that an
expression like `'(foo bar)` always turns into the list `(foo bar)`.
One way to think about this, in Scheme (R6RS / syntax-case) terms, is that
expressions like `'(foo bar)` turn directly into a syntax object when read,
and the created syntax object begins with an identifier bound to `quote` in
the standard library.
The decoder is, of course, configurable and extensible. The transformations
mentioned above would be performed only when it's told to decode data which
represents Zisp code. The decoder may be given a different configuration,
telling it to decode, for example, data which represents a different kind of
domain-specific data, such as application settings, build system commands,
complex data records with non-standard data types, and so on.
<!--
;; Local Variables:
;; fill-column: 77
;; End:
-->
|