依然可以使用
准备发布可以在 JSE 上运行带 Kotlin std 的版本,然后开始实现标准库宏
Lime#loadExtClass(Class) 和 Lime#defineMacro 、 Lime.handlers#put 来定义标准库准备发布可以在 JSE 上运行带 Kotlin std 的版本,然后开始实现标准库宏
能正常使用的证明:
~/AndroidStudioProjects/Lime/out/artifacts/Jar$ . /opt/android-studio/plugins/Kotlin/kotlinc/bin/kotlinc -cp Lime.jarWelcome to Kotlin version 1.2.30 (JRE 9.0.4+12-Debian-4)
Type :help for help, :quit for quit
>>> import lime.*
val sexp = Lime.parse("(print a b c)")[0]!! as SexpressionListval lime = Lime(sexp)lime.defineMacro("print", "varargs", "(. print varargs)")companion object o {@JvmStatic fun print(o: Array<Any?>): Any? {println(o)return o}}lime.handlers.put(Symbol("print"), o::class.java.getDeclaredMethods()[0])jshell -c Jar.jar:/opt/android-studio/lib/kotlin-runtime.jar
import lime.*
SexpressionList sexp = (SexpressionList) Lime.parse("(print 1 2 a)").get(0)
Lime lime = new Lime(sexp)
lime.defineMacro("print", "varargs", ". print varargs")
class Foo {
public static Object print(Object[] args) {
System.out.println(args);
return args;
}
}
java.lang.reflect.Method print = Foo.class.getDeclaredMethod("print", Object[].class)
lime.getHandlers().put(new Symbol("print"), print)
lime.set("a", 1)
lime.run()
lime.7z
8.2 KB
更新代码,增加了一些细节优化,macro 重写 toString,Lime 支持获取 sexp 列表和 get/set operator
duangsuse::Echo
jshell -c Jar.jar:/opt/android-studio/lib/kotlin-runtime.jar import lime.* SexpressionList sexp = (SexpressionList) Lime.parse("(print 1 2 a)").get(0) Lime lime = new Lime(sexp) lime.defineMacro("print", "varargs", ". print varargs") class Foo { public…
还可以修改一下试试
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) {
System.out.println(args);
return args;
}
}
java.lang.reflect.Method print = Foo.class.getDeclaredMethod("print", Object[].class)
lime.getHandlers().put(new Symbol("print"), print)
lime.set("a", 1)
lime.run()