duangsues.is_a? SaltedFish
下面我来说一下这次放假的四个事情: 1. Lime Lime 之前考虑了 新展开规则、宏对象、调试行号列号、元编程 API、引擎 API、虚拟机、编译形式、作用域、C 实现、重写和重写语言 等的问题,时间久远就不说细节了,透露一下以后 Lime 只有一个全局作用域,但是 (-> foreach (# (list proc) (with (ref 0) (do (i) (` (proc ([] list (<-- i)) (--> i (++ (<-- i))) (? (> i ([]- list))…
"Lime 的「六个展开」"
1.
否则,尝试全局的
这所谓「六个展开」其实可以归纳为三类
1. 宏展开
Lime 基于宏和自省功能来实现类似 Scheme 的语法,宏最终被展开为原生调用执行
Apply(施用宏)过程中,S 表达式首项必须是一个能被解析为宏的对象
而其后皆为宏的参数,如果参数长度不对,抛出 Arity Mismatch,除非是 vararg 宏
2. 原生调用
Lime 使用原生调用赋予拥有反射能力的 JVM 方便执行动态动作的能力
handlerid 其后皆为宏的参数,如果参数长度不对,抛出 Arity Mismatch,除非是 vararg 接收器
3. 无展开
不进行展开,直接返回原对象
1.
(symbol arglist)
2. (. handlerid arglist)
3. ((macro sexp) arglist)
4. ()
5. (macro-value arglist)
6. object
额外展开:^# 定义特殊的宏对象,它接受后面所有 S 表达式(1 args) 如果对象拥有 Macro toMacro() 方法,尝试使用 toMacro() 返回的宏否则,尝试全局的
(->macro 1) 返回的宏,如果没有定义直接失败,如果返回的不是宏也失败这所谓「六个展开」其实可以归纳为三类
1. 宏展开
Lime 基于宏和自省功能来实现类似 Scheme 的语法,宏最终被展开为原生调用执行
(symbol arglist)
((macro sexp) arglist)
(macro-value arglist)
(object arglist)「宏解析」允许解析「符号」、S 表达式列表、宏对象、可以转换为宏的对象
Apply(施用宏)过程中,S 表达式首项必须是一个能被解析为宏的对象
而其后皆为宏的参数,如果参数长度不对,抛出 Arity Mismatch,除非是 vararg 宏
2. 原生调用
Lime 使用原生调用赋予拥有反射能力的 JVM 方便执行动态动作的能力
(. handlerid arglist)
Lime 必须有一个手段把宏变为实际行动,这就是 Lime 如此做的途径,“原生”调用handlerid 其后皆为宏的参数,如果参数长度不对,抛出 Arity Mismatch,除非是 vararg 接收器
3. 无展开
不进行展开,直接返回原对象
()
object
Lime 不知道该如何展开这些对象,一般它认为这些对象已经被展开,所以直接返回他们Forwarded from duangsues.is_a? SaltedFish
基本数据类型
nil
bool
number
list
string
行注释
任何不可识别的都作为标识符
p.s. 冰封波博客上那个字符串 escape 失败不报错作为标识符的真是奇妙
展开规则:
对任何宏:检查参数列表长度,对所有参数 sexp 列表递归展开并对标识符解引用,然后填充宏参数递归展开,如果是 varargs 宏就直接将求值后的列表填充到 varargs 参数里
对
对
插件:
1. 取值 hook
2. 找不到变量 proc
3. SEND handler
4. 错误 hook
作用域:
全局变量
全局变量
不过它是惰性求值的
Lime 使用嵌套作用域
全局变量
nil
()bool
#t #fnumber
01 0x1 0b1001 0o122 2323N 32323D 2233.223F 66666L 6Blist
(a b c)string
'' "" "\"" "\n"行注释
; comment任何不可识别的都作为标识符
p.s. 冰封波博客上那个字符串 escape 失败不报错作为标识符的真是奇妙
展开规则:
对任何宏:检查参数列表长度,对所有参数 sexp 列表递归展开并对标识符解引用,然后填充宏参数递归展开,如果是 varargs 宏就直接将求值后的列表填充到 varargs 参数里
对
^* 宏:检查参数列表长度,然后填充宏参数递归展开,如果是 varargs 宏就直接将求值后的列表填充到 varargs 参数里对
. 宏:检查对应 send handler 参数列表长度,将所有参数 sexp 列表递归展开并对标识符解引用,发送调用到处理 handler插件:
1. 取值 hook
2. 找不到变量 proc
3. SEND handler
4. 错误 hook
作用域:
全局变量
args 在每次递归展开时有效,它是惰性求值的全局变量
__stack 储存了所有作用域表不过它是惰性求值的
Lime 使用嵌套作用域
全局变量
__env 表示整个 Lime 全局表__lime 表示解释器对象首先是关于某科学的 chatbot Semic
仍然停留在设想阶段
现在貌似是这样大概的结构
语言理解和输出
“乱想”系统
- 记忆(包含各种各种各种类型的...)
- 感情
逻辑处理和输出
仍然停留在设想阶段
现在貌似是这样大概的结构
语言理解和输出
“乱想”系统
- 记忆(包含各种各种各种类型的...)
- 感情
逻辑处理和输出