Full S-expression syntax
Lassi Kortela
(25 Sep 2019 09:16 UTC)
|
Re: Full S-expression syntax rain1@xxxxxx (26 Sep 2019 18:44 UTC)
|
Re: Full S-expression syntax rain1@xxxxxx 26 Sep 2019 18:43 UTC
On 2019-09-25 10:16, Lassi Kortela wrote: > Extending John's core S-expression spec in the other thread, here's a > quick proposal to cover his whole spreadsheet of datatypes at > <https://docs.google.com/spreadsheets/d/1V-7E5d3fLON5DrVeHkVvp9h5SRgcteOgnPl8KvWTA3M>: > > Fixed integer 1234 -123 > Fraction 12/34 > Symbol foo |:foo \| bar| > Keyword :foo (Common Lisp) > (Public symbol) my-package:my-symbol (Common Lisp) > (Private symbol) my-package::my-symbol (Common Lisp) > String "foo" > List (1 2 3) > Improper list (1 2 . 3) > > End-of-file object #!eof > Null #!null > Boolean #!true #!false > > Character #\foo > Vector #{...} > > Complex number #c{1 1} > Mapping #map{k1 v1 k2 v2 k3 v3} > Record/structure #record{k1 v1 k2 v3 k3 v3} > Bag #bag{1 2 3} > Set #set{1 2 3} > > Bit string #bits{101010101010101010101010} > > Bytevector #u8{1 2 3} > s8vector #s8{1 2 3} > u16vector #u16{1 2 3} > s16vector #s16{1 2 3} > u32vector #u32{1 2 3} > s32vector #s32{1 2 3} > u64vector #u64{1 2 3} > s64vector #s64{1 2 3} > > f32vector #f32{1 2 3} > f64vector #f64{1 2 3 > > c64vector #c64{...} > c128vector #c128{...} > > IEEE binary float #binfloat64{"4bd5c8047eefd0"} > Binary string #binstring{shift_jis > "82b182f182c982bf82cd90a28a450a"} > > 8601 datetime #datetime{"2016-06-12"} > 8601 duration #duration{"P3Y6M4DT12H30M5S"} > Column table #column-table{...} > Range #range{...} > > For the sake of consistency, I made some quite unusual changes above: > > Parentheses (...) are only used for lists. Vectors and all other stuff > use curly braces {...}. The rationale is that Lisp lists can be > improper lists, whereas vectors cannot. So a (...) parser has to > handle a consing dot, whereas a {...} parser should ban the consing > dot altogether. > > Also I changed #t and #f to #!true and #!false for consistency with > the other special objects #!eof and #!null. So sharpsign-bang (#!) is > always followed by a single symbol denoting a special object, and > nothing else. > > On the contrary, #foo{...} i.e. sharpsign followed immediately by a > symbol is a complex custom datatype. The symbol is always followed by > curly braces, and zero or more Lisp objects are read recursively > inside those braces. Their interpretation depends on the symbol after > the sharpsign. Readers who don't understand that symbol can skip past > the braces. > > I like the simplicity of the above proposal considering how many > datatypes and extensions it can handle. I'm happy to argue about the > details; I don't have a strong opinion that this is the one true way, > just an idea that came to mind. How about #{vector 1 2 3} and #{map k1 v1 k2 v2 k3 v3}?