能正常使用的证明:
~/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()
duangsuse::Echo
还可以修改一下试试 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"…
(print 1 2 a (print 233 "Hello, world") 23232323 (print2 a))Object[1] { Object[1] { [1, 2, 1, [Ljava.lang.Object;@2a742aa2, 23232323, [Ljava.lang.Object;@3dfc5fb8] } }这里有个误解,准确的说是我自己忘记了自己写的实现...
(. print varargs) 所以应该先 args = (Object[])args[0];Forwarded from iVanilla 自然科学 & 神秘学实验研究部 (iVanilla)
Telegram
ReadHub
Linux基金会为软件巨头收购GitHub辩护 微软是开源社区贡献第一人
企业初期对开源软件的态度有些敌对,即便微软近年来积极拥抱开源,并为 OSS 社区贡献了许多力量,很多人对其 75 亿美元收购 GitHub 一事还是感到耿耿于怀 ... 该组织执行总监 Jim Zemlin 在博客上发表了一篇声明,解释微软收购 GitHub对开源世界来说实际上是个好消息,且大家应该庆祝微软的这一明智之举 ... 它们有开发和发布基于 Linux 的产品、开源了 .Net,并且是 Linux 基金会、Apache…
企业初期对开源软件的态度有些敌对,即便微软近年来积极拥抱开源,并为 OSS 社区贡献了许多力量,很多人对其 75 亿美元收购 GitHub 一事还是感到耿耿于怀 ... 该组织执行总监 Jim Zemlin 在博客上发表了一篇声明,解释微软收购 GitHub对开源世界来说实际上是个好消息,且大家应该庆祝微软的这一明智之举 ... 它们有开发和发布基于 Linux 的产品、开源了 .Net,并且是 Linux 基金会、Apache…