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

对此有什么快速的想法,Nicola?这可能是CLJS一侧的编译器问题。

0 投票
_评论由:bronsa_

David,我明白为什么会发生这种情况,但我对cljs的js生成方式了解不足,无法提出修复方案。
问题出在这里这个提交: https://github.com/clojure/clojurescript/commit/d54defd32d6c5ffcf6b0698072184fe8ccecc93a 以下是以下场景的。

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


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

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

得到

`

对象[SyntaxError SyntaxError: Unexpected token return]

`

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