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

欢迎!请参见关于页面以获取更多关于这个工作的信息。

+1
ClojureScript

以下是生成无效JavaScript的简化测试案例:

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

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

`

编译后的JavaScript包含无效的令牌序列 "return return"。 (Chrome显示:Uncaught SyntaxError: Unexpected token 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。

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

嗯,看起来 {{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
参考文献: https://clojure.atlassian.net/browse/CLJS-968 (由 alex+import 报告)
...