Skip to content
duangsuse edited this page Mar 21, 2018 · 2 revisions

Lime sexp syntax

looks like

((# 1) () ())
(1 "" 'a 0x21i32)
(symbol #t #f "abc" 'abc 'abc' :symbol :'this is a symbol too'
"like #{'this}" 'eql_to "eql to" () "nil" (abcdefg) ('abcdefg') (' :a :b)
0o21 321i32 43.2
('is a symbol XD') ; it's a comment
; line comment
("symbol".symbol.symbol::symbol)

it represents

[[:#, 1], [], []]
[1, "", "a", 33]
[:symbol, true, false, "abc", "abc", "abc", [::, :symbol], :"this is a symbol too",
[:+, "like ", "this"], "eql to", "eql to", nil, "nil", [:abcdefg], [:abcdefg], [:', [::, :a], [::, :b]],
17, 32, 43.2
]

Rules

Orginal Chinese version

先亲定是这样的:
() 是 nil, 展开时 look-ahead 判断(且长度为 0 的list 展开时会被展开为 nil) (但是, `( )` 就是空列表)
(abcd_efg ) sexp 中第一项永远只能是 Symbol 或 sexp
(sym_bol)
((symbol ()) ()) [[:symbol, []], nil]
('' ) `'` 到 `'` 之间的部分是 Symbol, 但如果括号中第三个字符(`'` 后面那个)是空白字符,`'` 视为普通符号

字符串语法:
'abc_defg "abc defg"
'abc_defg' "abc defg"
(以 `'` 起始,以空白字符或 `'` `)` 终止,之间的 _ 视为空白字符)
"abcdefg" "abcdefg"
"abcdefg #{a}" (+ "abcdefg " a)
"abcd #{b} efg" (+ "abcd " (+ b " efg"))
(以 `"`起始,以 `"` 终止,之间支持 `#{}` 简写 )

符号语法:
:a (: a)
:'abc' :abc
:"abc" :abc

填充语法:
#t true
#f false
#n nil
#g 1
#e 0
#l -1
#h 新建 Hash 对象
#i 新建 List 对象(空 s-表达式)

数字语法:
032
434
23.2
0x1
0b1
0o1
0x123i32
0x32f64
数字以 0-9 起始,以空白字符或 ) 结束

表达式其他地方出现的任何不以
' " 0-9 # : ( 开头的都作为符号,以空白字符或 ) 终止

注释:
状态为 expecting_switch 时遇到 `;` 即无记录等待 `\n`

Clone this wiki locally