日记 2019-11-14
我太难了¶
好事是, 前几天Julia社区里蛮多给我的appreciation, 很暖心, 有厉害的人给recognition真的是嗨爆了.
坏事是, 这几天在refactor JuliaVariables.jl时遇到了阻碍, 已经一周都没想出解决方案了.
JuliaVariables.jl要做的, 就是接收一个Julia AST, 返回带scope的AST, 也就是scope analyzer, 但做起来实在是, 太难了 .
即使我已经写好了一个AST无关的scope solver框架, 但从Julia的AST去build solver依然还是太难了.
其等价功能的scheme代码, 按照Julia项目里 julia-syntax.scm 来看, 是有4000行以上的.
这和Python那边scope分析的情况不同: 即使CPython那边symbol table分析写得是不太好的, 有2000行的c文件, 但仍可以被使用更好算法的一百多行python代码解决.
不过, Python的scope analyzer实现之所以简单, 是因为Python的简洁和一致性, 几乎达到了没有module的ML语言一般(但表达力落后得较多).
Julia的情况不同, 它context-sensitive的语法构造比较多, 导致需要写代码处理special case.
比如赋值符号 =
.
在tuple里就不是赋值, 是namedtuple;
LHS是函数调用, 例如 f(x) = x
就是函数定义;
在 let
和 for
里, LHS是内部作用域的, RHS是外部作用域的.
总之思考很久没有漂亮的做法, 一贯好用的tagless-final在这里似乎也遇到了小挫折…
个人开发者, 想要模仿Julia实现里那及其复杂的几千行是不太可行的, 必须要依靠进步的算法和技术, 以及自动化工具.