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