日记 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, 还愿意放弃争取现实中的大部分事情, 把精力放到开源项目上的人了.

这件事之外, 前段时间日本那边签证也实在地拿到手上了, 突然还有一周半就要出国了.

总觉得回家这么几个月都没休息一下, 有点令人窒息…