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 的 JavaScript 输出知之甚少,无法提出修复方案。
问题在于这个提交:[https://github.com/clojure/clojurescript/commit/d54defd32d6c5ffcf6b0698072184fe8ccecc93a](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。

这导致以下两个都为真并发出 "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)

发出。

0
by

评论者:dnolen

Hrm,看起来 {{analyze-wrap-meta}} 可能需要委托给一个辅助程序来更改给定 AST 节点的 {{:context}}。

0
by

评论者:bendlas

我只是升级了一个旧项目时偶然遇到这个问题。还有一个重复的问题:[http://dev.clojure.org/jira/browse/CLJS-1482](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](https://clojure.atlassian.net/browse/CLJS-968)(由 alex+import 提出)
...