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

对此有什么快速想法吗,Nicola?这可能是一个 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的上下文为:返回。

这导致以下两个条件都为真,并发出"返回":
[链接](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

Hrm,看起来{{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点赞
...