duangsues.is_a? SaltedFish
59 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
Forwarded from duangsuse::Echo
#PL #project 第一门函数式和能用的语言,就是没写标准库还啥都不能用

支持插件,使用模块化设计
Forwarded from duangsuse::Echo
好用 Lime
Forwarded from duangsuse::Echo
合影留念 #PL #project
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()
(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 不支持元数据....
测试已经手工有了那我就不写了
如果要实现 Java 接口的话也可以,Lite 那有一个没测试过的 InvocationHandler
Android proguard 配置
This media is not supported in your browser
VIEW IN TELEGRAM