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_ 评论

大卫,我明白这是怎么发生的,但我不够了解cljs的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} ..}]
        ..}
 ..}


即,analyze-wrap-meta 将 :fn 节点的上下文从 :return 改为 :expr,但保持 :fn-methods 的上下文为 :return。

这导致
https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L575-L576

https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L488 (https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L233)

都被视为正确,并输出一个 "return"。

0

由:dnolen 评论

Hrm,看来 {{analyze-wrap-meta}} 可能需要委派给辅助函数来修改给定 AST 节点的 {{:context}}。

0

评论者:bendlas

我只是随机遇到了这个问题,当升级一个旧项目时。还有一个重复的问题: http://dev.clojure.org/jira/browse/CLJS-1482

0

评论者:gingenhagen

即使没有 let,这个问题也会发生。

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

给我的是

`

object[SyntaxError SyntaxError: Unexpected token return]

`

0
...