请在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 节点的上下文更改为 :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
by

评论由:dnolen发表

嗯,看起来{{analyze-wrap-meta}}可能需要依赖一个助手来改变给定的AST节点{{:context}}。

0
by

由bendlas发表评论

我在升级一个旧项目时偶然遇到了这个问题。还有一个重复的: http://dev.clojure.org/jira/browse/CLJS-1482

0
by

由gingenhagen发表评论

即使没有let,这个问题也会在我身上发生。

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

给我

`

object[SyntaxError SyntaxError: Unexpected token return]

`

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