https://mohu1.tk/question/1061 #China #Bear
新蛤社 -
🕐
👍 9 📝 1
龙蛤前辈 -
🕐
👍 4 📝 2
wallais • 1 天前
江蛤蟆是坠吼的 • 1 天前
新蛤社 -
新蛤社官方账号 赞同来自: 江蛤蟆是坠吼的 、Rayista 、龙蛤前辈 、冮泽民 、赛艇爱好者`早上起床后开倒车去山区帮村民修理沼气池,中午在衣家就餐,吃锅里蒸的包子。下午扛 200 斤麦子走十里山路锻炼身体,天黑前出山开倒车至庆丰包子铺 ,要三两猪肉大葱包子,炒肝和芥菜。吃完晚饭后回家阅读萨格尔王传,为考上清华做准备,看累后就睡觉做中国梦。
🕐
18 小时前👍 9 📝 1
龙蛤前辈 -
大力资瓷文膜武乳,坚决反对尬膜尬乳,做一个高知识水平,坚持每天为虵献出一秒的蛤丝!赞同来自: IceyEllegaard、男孩为何穿红衣、冮泽民、夕张号巡洋舰买一笼维尼熊包子丢到粪坑里。
🕐
1 天前👍 4 📝 2
wallais • 1 天前
满脸喷粪呐江蛤蟆是坠吼的 • 1 天前
@wallais: 满脸是粪mohu1.tk
在习近平诞辰日(6月15日),你们会进行什么活动? - 膜乎
在习近平诞辰日(6月15日),你们会进行什么活动? - 如题<img src="/uploads/ueditor/20180527/1527406878997074.jpg" title="1527406878997074.jpg...
基本数据类型
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 表示解释器对象%unicode
%line
%column
LineTerminator = \r|\n|\r\n
InputCharacter = [^\r\n]
WhiteSpace = [ \t\f]
Comment = ";" {InputCharacter}* {LineTerminator}?
"\\b" { string.append('\b'); }
"\\t" { string.append('\t'); }
"\\n" { string.append('\n'); }
"\\f" { string.append('\f'); }
"\\r" { string.append('\r'); }
"\\\"" { string.append('\"'); }
"\\'" { string.append('\''); }
"\\\\" { string.append('\\'); }
\\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1), 8);
string.append(val); }
/* error cases */
\\. { throw new RuntimeException("Illegal escape sequence \"" + yytext() + "\""); }
某些特殊字符定义和 double-quoted string escape
单引号字符串不处理 escape
duangsues.is_a? SaltedFish
基本数据类型 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 失败不报错作为标识符的真是奇妙 展开规则: 对任何宏:检查参数列表长度,对所有参数 sexp 列表递归展开并对标识符解引用,然后填充宏参数递归展开,如果是 varargs…
plugin class file 统一使用 class name
包含 public 方法
内部提供
LimePlugin包含 public 方法
onLoad(Llime/Lime;)V onUnLoad(Llime/Lime;)V内部提供
ext 和 ext~ 来加载/卸载插件(-> boys ([str Rikka ice100 pandecheng Yutta))
(-> say-hello (# (name)
(@ name " 女装哦 🌚")))
(each boys say-hello)
1:1 = (
1:3 = ->
1:8 = boys
1:10 = (
1:14 = [str
1:20 = Rikka
1:27 = ice100
1:38 = pandecheng
1:44 = Yutta
1:45 = )
1:46 = )
2:1 = (
2:3 = ->
2:13 = say-hello
2:15 = (
2:16 = #
2:18 = (
2:22 = name
2:23 = )
3:1 = (
3:2 = @
3:7 = name
3:16 = " 女装哦 🌚"
3:18 = )
3:19 = )
3:20 = )
4:1 = (
4:5 = each
4:10 = boys
4:20 = say-hello
4:21 = )
(
:->
:boys
(
:[str
:Rikka
:ice100
:pandecheng
:Yutta
)
)
(
:->
:say-hello
(
:#
(
:name
)
(
:@
:name
女装哦 🌚
)
)
)
(
:each
:boys
:say-hello
)
(-> say-hello (# (name)
(@ name " 女装哦 🌚")))
(each boys say-hello)
1:1 = (
1:3 = ->
1:8 = boys
1:10 = (
1:14 = [str
1:20 = Rikka
1:27 = ice100
1:38 = pandecheng
1:44 = Yutta
1:45 = )
1:46 = )
2:1 = (
2:3 = ->
2:13 = say-hello
2:15 = (
2:16 = #
2:18 = (
2:22 = name
2:23 = )
3:1 = (
3:2 = @
3:7 = name
3:16 = " 女装哦 🌚"
3:18 = )
3:19 = )
3:20 = )
4:1 = (
4:5 = each
4:10 = boys
4:20 = say-hello
4:21 = )
(
:->
:boys
(
:[str
:Rikka
:ice100
:pandecheng
:Yutta
)
)
(
:->
:say-hello
(
:#
(
:name
)
(
:@
:name
女装哦 🌚
)
)
)
(
:each
:boys
:say-hello
)
Forwarded from duangsuse::Echo
jshell> import lime.*
jshell> Lime.parse("(sa(. as21 21) 32)")
$2 ==> [[:sa, [:., :as21, 21], 32]]
jshell> SexpressionList p=Lime.parse("(sa(. as21 21) 32)")
p ==> [[:sa, [:., :as21, 21], 32]]
jshell> Lime l = new Lime(p)
l ==> lime.Lime@30b8a058
jshell> l.run()
| java.lang.RuntimeException thrown: Lime internal error: Failed to expand [[:sa, [:., :as21, 21], 32]] in file <unknown>
| at Lime.raise (Lime.kt:158)
| at Lime.run (Lime.kt:132)
| at (#6:1)
jshell> Lime l = new Lime((SexpressionList)p.get(0))
l ==> lime.Lime@3234e239
jshell> l.run()
| java.lang.RuntimeException thrown: Lime internal error: Failed to resolve reference to :sa in file <unknown>
jshell> p.get(0)
$10 ==> [[:., :as21, 21], 32]
于是我们
jshell> l.getHandlers()
$11 ==> {}
... 好麻烦
duangsues.is_a? SaltedFish
刚才突然想到要重构些什么,吃完饭居然忘了
其实我想的是作用域至少有一个 hook 要加,或者使用另一种子解释器更直接的作用域,BeanShell 就是这种方法,我也这么打算
另外就是一个设计我写代码的时候理解错了...
另外就是一个设计我写代码的时候理解错了...
^# 调用起来是 (# ...) ,这是为了让这类宏正常工作的,是对 # 的覆盖,我以为是 (^# ..) ... 算了import lime.*
SexpressionList sexp = (SexpressionList) Lime.parse("(print 1 2 a (print 233 \"Hello, world\") 23232323 (print2 a))").get(0)
Lime lime = new Lime(sexp)
lime.defineMacro("print", "varargs", ". print varargs")
lime.defineMacro("print2", "varargs", ". print 233")
class Foo {
public static Object print(Object[] args) {
pp(args);
return args;
}
static void pp(Object[] args) {
for (Object i : args)
if (i instanceof Object[]) {
System.out.println('[');
pp((Object[])i);
System.out.println(']');
}
else
System.out.println(i);
}
}
java.lang.reflect.iss.onethod print = Foo.class.getDeclaredMethod("print", Object[].class)
lime.getHandlers().put(new Symbol("print"), print)
lime.set("a", 1)
lime.run()
duangsues.is_a? SaltedFish
import lime.* SexpressionList sexp = (SexpressionList) Lime.parse("(print 1 2 a (print 233 \"Hello, world\") 23232323 (print2 a))").get(0) Lime lime = new Lime(sexp) lime.defineMacro("print", "varargs", ". print varargs") lime.defineMacro("print2", "varargs"…
import lime.*
SexpressionList sexp = (SexpressionList) Lime.parse("(print 1 2 a (print 233 \"Hello, world\") 23232323 (print2 a))").get(0)
Lime lime = new Lime(sexp)
lime.defineMacro("print", "varargs", ". print varargs")
lime.defineMacro("print2", "varargs", ". print 233")
class Foo {
public static Object print(Object[] args) {
pp(args);
return args;
}
static void pp(Object[] args) {
args = (Object[])args[0];
for (Object i : args)
if (i instanceof Object[]) {
System.out.println('[');
pp((Object[])i);
System.out.println(']');
}
else
System.out.println(i);
}
}
java.lang.reflect.iss.onethod print = Foo.class.getDeclaredMethod("print", Object[].class)
lime.getHandlers().put(new Symbol("print"), print)
lime.set("a", 1)
lime.run()
SexpressionList sexp = (SexpressionList) Lime.parse("(print 1 2 a (print 233 \"Hello, world\") 23232323 (print2 a))").get(0)
Lime lime = new Lime(sexp)
lime.defineMacro("print", "varargs", ". print varargs")
lime.defineMacro("print2", "varargs", ". print 233")
class Foo {
public static Object print(Object[] args) {
pp(args);
return args;
}
static void pp(Object[] args) {
args = (Object[])args[0];
for (Object i : args)
if (i instanceof Object[]) {
System.out.println('[');
pp((Object[])i);
System.out.println(']');
}
else
System.out.println(i);
}
}
java.lang.reflect.iss.onethod print = Foo.class.getDeclaredMethod("print", Object[].class)
lime.getHandlers().put(new Symbol("print"), print)
lime.set("a", 1)
lime.run()
(print 1 2 a (print 233 "Hello, world") 23232323 (print2 a))
[233, Hello, world]
233
[1, 2, 1, [Ljava.lang.Object;@3cb1ffe6, 23232323, [Ljava.lang.Object;@3dfc5fb8]
另外 Lexer 的 debug info 几乎是(已经)白加了,Parser 和 SexpressionList 不支持元数据....