This is a framework to work with s-expressions.
In contrast to some other implementations, there are two types of atoms:
symbols and strings. Symbols are case-insensitive. A string may contain any
sequence of unicode characters, using UTF-8 encoding. An expression of the
form (), (A), (A B), ..., is a pair list, where A and B are
s-expressions. If it has the form (A . B) it is a pair. An expression of the
form [], [A], [A B], ..., is a vector, where A and B are s-expressions.
The framework contains types, functions, and methods to create s-expressions, to encode them as a string, and to evaluate them. Evaluation creates a third atom type, which currently cannot be encoded fully in a s-expression: forms (aka functions). Forms can be special. In this case their arguments are not evaluated before calling the form.
;starts a comment that lasts until end of line- String =
"CHAR*"is a sequence of characters, delimited by quotes- CHAR = any unicode character except from category C ("control") or an escaped character (ECHAR).
- ECHAR a character sequence that starts with a backspace ```
\t= tabulator (code 9)\n= new line (code 10)\r= carriage return (code 13)\xMN= character with code MN (hex digits)\uMNOP= character with code MNOP (hex digits)\UMNOPQR= character with code MNOPQR (hex digits)- any other character, excapt category C = the character itself, e.g.
\\= backslash,\"= quote.
- Symbol = a sequence of characters, except category C and Z ("separator"),
and except
",(,),[,],;,.. - Pair =
(Z* (s-expression (Z* s-sexpression)* (Z*.Z* s-expression)?)? Z*) - Vector =
[Z* (s-expression (Z* s-expression)*)? Z*] - Z = any unicode of category Z
- Cyclic structures are currently not supported. Creating them will likely lead to a stack overflow when working with them.
- Zettelstore and its client library use this framework for transferring data and to help encoding some other data formats.
- My students will use it for various lectures / seminars.