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

欢迎!有关此操作的更多信息,请参阅关于页面。

+1
ClojureScript

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

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

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

`

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

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

7 个答案

0

评论者:bobby.eickhoff

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

0

评论者:dnolen

尼古拉,对此有什么看法吗?这可能是 CLJS 侧的编译器问题。

0
_评论者:bronsa_

大卫,我明白为什么会出现这种情况,但我对 cljs 的 JavaScript 发射理解不多,无法提出解决方案。
问题在于:在这个提交: https://github.com/clojure/clojurescript/commit/d54defd32d6c5ffcf6b0698072184fe8ccecc93a 的指导下,以下情况是可能的

{:op :meta
 :env {:上下文 :返回}
 :表达式 {:操作 :函数}
        :env {:上下文 :表达式}
        :方法 [{:操作 :函数方法
                   :env {:上下文 :返回} ...}]
        ...}
 ...}


即 analyze-wrap-meta 将 :函数 节点的上下文更改为 :表达式,但保留 :函数方法 的上下文为 :返回。

这导致以下两个条件都为真并发出 "返回"。
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

评论者:dnolen

嗯,看起来 analyze-wrap-meta 可能需要委托给一个助手来更改给定 AST 节点的 :上下文。

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
参考: https://clojure.atlassian.net/browse/CLJS-968 (由 alex+import 报告)
...