请在2024 年 Clojure 调查中分享您的想法!

欢迎!有关如何使用本站更多信息,请参阅关于页面。

0 投票
ClojureScript
已安装 Graal


$ java -version
openjdk 版本 "1.8.0_212"
OpenJDK 运行时环境 (构建 1.8.0_212-20190420112649.buildslave.jdk8u-src-tar--b03)
OpenJDK GraalVM CE 19.0.0 (构建 25.212-b03-jvmci-19-b01,混合模式)



$ clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"}}}' -m cljs.main -re graaljs
ClojureScript 1.10.520
cljs.user=> (ns com.foo)

com.foo=> (defn bar [])
#'com.foo/bar
com.foo=> (bar)
执行错误(错误)在 (<cljs repl>:1).
(中间值).foo.bar.call 不是一个函数

17 答案

0 投票

评论由:kommen 提供

GraalJS 问题:https://github.com/graalvm/graaljs/issues/164

0 投票

评论由:mfikes 提供

让我想起了 CLJS-2770

0 投票
_评论由:mfikes 提供_

我不知道是否将 {{js.java-package-globals}} 设置为禁用以解决此问题,或者这会引入其他问题


$ clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"}}}' -m cljs.main -re graaljs -ro '{"js.java-package-globals" "false"}' -r
ClojureScript 1.10.520
cljs.user=> (ns com.foo)

com.foo=> (defn bar [])
#'com.foo/bar
com.foo=> (bar)
nil


请参阅https://script.clojure.org/reference/repl-options#_graal_js_repl_options
0 投票

评论由:kommen 提供

使用{{js.java-package-globals}}也可以解决问题,因为提供更多的顶级域名(packages, java, javafx, javax, com, org, edu)也将修复对这些域名的使用。正如Mike指出的,这将会是一个破坏性变更,如果有人依赖这些全局变量在Graal环境运行时存在的话。

0 投票

评论由:kommen 提供

CLJS-3087-2.patch默认关闭java包的全局变量。

我更希望与JavaScript引擎以及Graaljs上运行的Clojure和ClojureScript之间的兼容性超过提供java包全局变量作为快捷方式。这种功能仍然可以通过 {{Java.type}}(见链接:https://github.com/clojure/clojurescript/blob/3a0c07477ae781bf521bdc2b074ed7b783bb93f3/src/main/cljs/cljs/bootstrap_graaljs.js#L4)使用。

0 投票

评论由:mfikes 提供

尽管这严格来说是个破坏性变更,但GraalJS还没有推出那么长时间,因此这样的变更不大可能破坏任何人。如果真的破坏了,也有可能覆盖默认设置。

(链接:~kommen) 您曾指出在这里看到了Java包的使用:https://github.com/clojure/clojurescript/blob/master/src/main/clojure/cljs/closure.clj#L1672-L1676

我没有看,如果我们要修订默认值,它们是否会受到影响?

0 投票

评论由:kommen 提供

(链接:~mfikes) 就我所知,改变默认值不会影响这些内容,因为使用默认选项创建的GraalJS引擎不会用来运行由 {{output-main-file}} 产生的工件。但我仍然建议将这些使用方式更改为使用{{Java.type}}(有待与Nashorn兼容性确认),这样一个人可以使用关闭{{js.java-package-globals}}的GraalJS的{{js}}命令行工具,同时生成的主文件也可以正常工作。

0 投票

评论由:mfikes 提供

CLJS-3087-2.patch 通过了CI测试

0 投票

评论由:mfikes 提供

CLJS-3087-2.patch 已添加到补丁传递(i)

0 投票

评论由:mfikes 提供

CLJS-3087-2.patch 已通过LGTM评审(y)

0 投票

评论由:kommen 提供

在graaljs问题(链接:https://github.com/graalvm/graaljs/issues/164 文本:graaljs issue)的处理中,他们不打算更改{{js.java-package-globals}}的默认值,因此虽然CLJS-3087-2.patch会修复GraalJS repl的问题,但在使用{{js}}或{{nodejs}}命令行工具时,人们仍然需要了解需要将它们关闭。

0 投票
_发表的评论:kommen_

一个遇到此问题的实际例子



clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"} com.cognitect/transit-cljs {:mvn/version "0.8.256"}}}' -m cljs.main -re graaljs
ClojureScript 1.10.520
cljs.user> (require '[cognitect.transit :as t])
执行错误 () 在 (<cljs repl>:1)。
null

0 投票

发表的评论:dnolen

迪特,我不明白您关于jsnodejs的最后一个评论。它们是如何受到影响的?

0 投票

发表的评论:dnolen

我倾向于第二个补丁,该补丁禁用隐式全局导入。无论如何这都是一件糟糕的事情 ... 另一票 - 但在考虑我们是否应该有 Java 包的 require 支持。

0 投票
by

评论由:kommen 提供

(链接:~dnolen) GraalVM 包含了 {{bin/js}} 和 {{bin/nodejs}} 二进制文件,它们都使用 GraalJS 引擎,但默认将 {{js.java-package-globals}} 设置为 {{true}}。因此,如果使用 GraalVM 的 {{nodejs}} 运行 ClojureScript 产物,仍然会遇到有关具有问题前缀的命名空间的问题。当然,这超出了 ClojureScript 的控制范围,但我认为这也从另一个角度看待了补丁,因为它并没有涵盖所有可能导致此问题的路径。

...