日记 2019-11-17
我太懂了¶
Made progress.
现在Julia scope analyzer的部分核心代码如下, 还是很工整漂亮的:
@when Expr(:let, :($a = $b), body) = ex
S₀ = S[]
S₁ = CHILD(S₀, PSEUDO)
RHS(S₀, b)
LOCAL_LHS(S₁, a)
RHS(S₁, body)
S[] = S₀
IS_SCOPED(S₁, body)
SymRef[]
@when Expr(:let, a::SymRef, body) = ex
S₀ = S[]
S₁ = CHILD(S₀, PSEUDO)
LOCAL(S₁, a)
RHS(S₁, body)
IS_SCOPED(S₁, body)
S[] = S₀
SymRef[]
@when Expr(:let, Expr(:block), body) = ex
S₀ = S[]
S₁ = CHILD(S₀, PSEUDO)
RHS(S₁, body)
IS_SCOPED(S₁, body)
S[] = S₀
SymRef[]
说实话, 写完之后看起来总有点像codegen(特有幻视…
总的来说, once again使用更好的算法和抽象去解决了问题, 代码量只有别人十分之一, 可读性也十倍nice, 不过性能上就不知道了, RAII用的多了点.
未来还打算用ML module去实现extensible/customizable的scope analyzer:
众所周知, 大部分的宏变换是无法静态分析的(所以只能展开后检查). 但比方说, MLStyle里的模式匹配, 就有着确定的可静态分析的scope信息: 只要我专门添加几个match规则, 就可以支持一些pattern的scope检查.
这种扩展可以使用ML module来做到, 只需要把旧的模块include进去, 或者做成parameterised module的形式即可.
所谓的Julia中的ML module, 当然也是我实现的, 因为目前世界上, 应该没有其他又有相应知识能力, 又这么了解Julia, 还愿意放弃争取现实中的大部分事情, 把精力放到开源项目上的人了.
这件事之外, 前段时间日本那边签证也实在地拿到手上了, 突然还有一周半就要出国了.
总觉得回家这么几个月都没休息一下, 有点令人窒息…