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

欢迎!请参阅关于页面了解此功能的相关信息。

+1
ClojureScript

以下是一个产生无效JavaScript的最小测试用例

`
(defn f []
(let [a 0]

^{"meta" "data"}
(fn [] true)))

`

编译后的JavaScript包含无效的令牌序列"return return"。(根据Chrome:未捕获的语法错误:意外的return令牌)

如果元数据应用于映射字面量而不是函数字面量,则不会出现此问题。
只有当函数和元数据在let块内时,才会出现此问题。

7 回答

0

评论者:bobby.eickhoff

我忘了试with-meta。使用with-meta不会产生此语法错误,因此这仅是元数据读取宏的问题。

0

评论者:dnolen

关于这个,尼古拉,你有什么快速的想法?这可能是CLJS侧的编译器问题。

0
评论由:bronsa_做出

大卫,我理解为什么会出现这种情况,但我对ClojureScript的js输出了解不足,无法提出修复方案。
问题是,在此提交中: https://github.com/clojure/clojurescript/commit/d54defd32d6c5ffcf6b0698072184fe8ccecc93a 以下情况是可行的

{:op :meta
   :env {:context :return}
   :expr {:op :fn
       :env {:context :expr}
       :methods [{:op :fn-method
               :env {:context :return}
                   :methods [{...}]
       classes [...}


       ..}

   ..}
也就是 analyze-wrap-meta 改变了 :fn 节点的上下文为 :expr,但保持 :fn-methods 的上下文为 :return。
这导致了以下两个情况都为真,并输出 "return"。*
https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L575-L576



0
看起来 {{analyze-wrap-meta}} 可能需要推迟到辅助器来改变给定AST节点的 {{:context}}。

评论由:bendlas做法

我只是随机升级了老旧的项目时遇到了此问题,也有重复的已知问题: http://dev.clojure.org/jira/browse/CLJS-1482

0

评论由:gingenhagen做法

即使没有 let 也会出现此问题。

(fn [] ^{"meta" "data"} (fn [] true))

给出了

`

对象[SyntaxError SyntaxError: Unexpected token return]

`

0
参考: https://clojure.atlassian.net/browse/CLJS-968 (由 alex+import 报告)
...