## 基本数据类型
+ nil
+ bool
+ number
+ list
+ string
### 行注释
任何不可识别的都作为标识符
p.s. 冰封波博客上那个字符串 escape 失败不报错作为标识符的真是奇妙
## 展开规则:
+ 对任何宏:检查参数列表长度,对所有参数 s-expression 列表递归展开并对标识符解引用,然后填充宏参数递归展开,如果是 varargs 宏就直接将求值后的列表填充到 varargs 参数里
+ 对
+ 对
## 插件:
0. 提供
1. 取值 hook
2. 找不到变量 procedure
3. SEND handler
4. 错误 hook
## 作用域:
全局变量
全局变量
不过它是惰性求值的
Lime 使用嵌套作用域
全局变量
+ nil
()+ bool
#t #f+ number
01 0x1 0b1001 0o122 2323N 32323D 2233.223F 66666L 6B+ list
(a b c)+ string
'' "" "\"" "\n"### 行注释
; comment任何不可识别的都作为标识符
p.s. 冰封波博客上那个字符串 escape 失败不报错作为标识符的真是奇妙
## 展开规则:
+ 对任何宏:检查参数列表长度,对所有参数 s-expression 列表递归展开并对标识符解引用,然后填充宏参数递归展开,如果是 varargs 宏就直接将求值后的列表填充到 varargs 参数里
+ 对
^* 宏:检查参数列表长度,然后填充宏参数递归展开,如果是 varargs 宏就直接将求值后的列表填充到 varargs 参数里+ 对
. 宏:检查对应 send handler 参数列表长度,将所有参数 s-expression 列表递归展开并对标识符解引用,发送调用到处理 handler## 插件:
0. 提供
ext ext~ macro 和 onLoad(Llime/Lime)V`、`onUnload(Llime/Lime)V`,插件类统一叫 `LimePlugin1. 取值 hook
2. 找不到变量 procedure
3. SEND handler
4. 错误 hook
## 作用域:
全局变量
args 在每次递归展开时有效,它是惰性求值的全局变量
__stack 储存了所有作用域表不过它是惰性求值的
Lime 使用嵌套作用域
全局变量
__env 表示整个 Lime 全局表__lime 表示解释器对象(-> boys ([str Rikka ice100 pandecheng Yutta))
(-> say-hello (# (name)
(@ name " 女装哦 🌚")))
(each boys say-hello)
java -cp out/production/Lime/:/opt/android-studio/lib/kotlin-runtime.jar lime.ParserMain(
:->
:boys
(
:[str
:Rikka
:ice100
:pandecheng
:Yutta
)
)
(
:->
:say-hello
(
:#
(
:name
)
(
:@
:name
女装哦 🌚
)
)
)
(
:each
:boys
:say-hello
)
那么现在就把这些作为内建的 macro(真正内建的只有 handler)
-> define
-? defined?
-x undef
<- read (mp)
. send
=> hash
# macro
: to_symbol
->s to_string
[str string_array
~~ must_sequence
` loop
`` must_loop
? cond
% typeof
:: index
::= index_eq
ext extension_load
ext~ extenseion_unload
require require_library
eval eval
^ car
$ cdr
@ puts
@! warn
@< gets
λ lambda
#< macro_args (mp)
#> macro_body (mp)
[] square_index
[]= square_index_eq
[]? has_key?
[]- ary_length
[]* keys
str-includes
str-match
+ add
++ inc
- sub
-- dec
* mul
/ div
** pwr
% mod
> lt
< bg
>= le
< be
& and
| or
! not
^ xor
<< shl
>> shr
$type-># to_macro
p print
!! raise
r valueof
依然可以使用
准备发布可以在 JSE 上运行带 Kotlin std 的版本,然后开始实现标准库宏
Lime#loadExtClass(Class) 和 Lime#defineMacro 、 Lime.handlers#put 来定义标准库准备发布可以在 JSE 上运行带 Kotlin std 的版本,然后开始实现标准库宏