请在2024年Clojure状态调查中分享您的想法!

欢迎!有关如何使用此平台的更多信息,请参阅关于页面。

0
ClojureScript
tools.analyzer 具有一个方便的基于映射的分析结果AST格式。我们应在ClojureScript分析器中使用此格式,以便接受此格式的工具能够无缝地与ClojureScript一起工作。

正在进行的工作:https://github.com/frenchy64/clojurescript/pull/7



工作顺序
# 补丁 1: CLJS-2260
  #* :const
    #** 将 :constant 操作符重命名为 :const
    #** 添加 :val 条目
# 补丁 2: CLJS-2788
  #* :the-var
    #** 将 :var-special 操作符重命名为 :the-var
  #* :deftype
    #** 将 :deftype* 操作符重命名为 :deftype
  #* :defrecord
    #** 将 :defrecord* 操作符重命名为 :defrecord
  #* :with-meta
    #** 将 :meta 操作符重命名为 :with-meta
# 补丁 3: CLJS-2789
  #* :def
    #** 添加 :ns 条目
  #* :throw
    #** 将 :throw 条目重命名为 :exception
  #* :try
    #** 将 :try 条目重命名为 :body
  #* :letfn
    #** 将 :expr 条目重命名为 :body
  #* :let/:loop
    #** 将 :expr 条目重命名为 :body
  #* :invoke
    #** 将 :f 重命名为 :fn
# 补丁 4: CLJS-2797
  #* :fn-method
    #** 将 :method 操作符重命名为 :fn-method
    #** 将 :expr 条目重命名为 :body
    #** 将 :max-fixed-arity 重命名为 :fixed-arity
    #** 将 :variadic 重命名为 :variadic?
  #* :host-field/:host-call
    #** 将 :dot 操作符拆分为 :host-field/:host-call
  #* :js-object/:js-array
    #** 将 :js-value 操作符拆分为 :js-object/:js-array
  #* :case
    #** 将 :case* 操作符重命名为 :case
    #** 将 :v 重命名为 :test
    #** 添加 :case-node 操作符用于组合 :case-test 和 :case-then 操作
# 补丁 5: CLJS-2800
  #* :new
    #** 将 :ctor 重命名为 :class
  #* :children
    #** 将 :children 移动到 tools.analyzer :children 格式
       #*** :children 是关键字键的向量
       #*** 确保所有序列子项都是向量
    #** 将 :children 调用替换为从 AST -> children 的兼容函数
# 补丁 6: CLJS-2801
  #* :quote
    #** 添加 :quote 操作符
      #*** 注意:这也将大量逻辑移至处理 emitter 中的 :const。我们将 emit-constant -> emit-constant* 并将 emit-constant 转换为在将调用委托给 emit-constant* 之前为每个形式生成元数据的函数。
      #*** 注意:一些 emit* defmethods 被抽离成高阶函数助手 (:{map,list,vector,set} -> emit\-{map,list,vector,set}),现在既可以从 emit 又可以从 emit-constant 调用。
      #*** 注意:analyze-const 现在注册常量,但会丢弃分析结果。
#* :list
    #** 移除 :list 操作
      #*** 注释:已被 :quote'd :const 吸收。analyze-list 仍用于注册常量。
#* 引入的回归问题通过 CLJS-2807 解决
补丁 7:CLJS-2803
  #* :record-value
    #** 移除 :record-value 操作,替换为 :const
    #** 为记录字面量添加单元测试
补丁 8:CLJS-2257
  #* :var/:binding/:local/:js-var
    #** 解构点符号
    #** 将 :var 操作拆分为 :var/:binding/:local/:js-var
    #** 如果 :js-shadowed-by-local,则输出 :local 操作
    #** 将 :local 改为 #{:fn :letfn :let :arg ...}
  #* 在 'var 解析中进行参数验证
  #* 为合成的 `do` 块添加 :body? 条目
  #* 单元测试
    #** 所有单元测试都添加到末尾
  #* AST 格式文档
    #** 从 tools.analyzer 进行修改

额外内容
* :const 操作中的 :type 字段
* :try/:catch
  ** 转换为 tools.analyzer.js 风格 (:try 有 :catches,一个 :catch 节点向量)
* :binding 的 :form 应该是 :name
* 在 :deftype/:defrecord 中将 :t 重命名为 :name
* 使用命名空间限定语气 CLJS 特定的操作

3 个答案

0
by

发表的评论者:ambrosebs

在这个问题的主体中,我提出了一系列可能的补丁,这样每个补丁都很容易筛选。

能否对此给予一些反馈?是否应该将某些步骤合并/拆分?

0
by

发表的评论者:benedek.fazekas

在查看https://github.com/clojure-emacs/refactor-nrepl/issues/195 时记录我的发现,以便有人可能觉得它有用。

基于上述问题,我认为 CLJS-2051 与此票据有关。我还发现

  • :raw-forms 包含宏展开的各个阶段,包括原始形式,但是不是 CLJS ASTs 的一部分
  • :op = :binding 节点在 CLJS ASTs 中似乎缺少 :children 条目,因此使用 :children 引用遍历 AST 会截断在 :binding 节点
0
参考: https://clojure.atlassian.net/browse/CLJS-1461(由ambrosebs提出)
...