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 不支持元数据....