请在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}}设置为禁用它们是否足够解决此问题,或者这将引入其他问题


使用以下命令:
ClojureScript 1.10.520
cljs.user=> (ns com.foo)

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


有关Graal JS REPL选项的更多信息,请参阅:https://script.clojure.org/reference/repl-options#_graal_js_repl_options
0
回答于 by

评论由:kommen制作

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

0
回答于 by

评论由:kommen制作

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

我更倾向于与其他JS引擎以及graaljs上运行的Clojure和ClojureScript之间的兼容性,而不是将Java包的全局变量作为快捷方式提供。功能仍然可以通过{{Java.type}}使用并保持可用,如链接所示:https://github.com/clojure/clojurescript/blob/3a0c07477ae781bf521bdc2b074ed7b783bb93f3/src/main/cljs/cljs/bootstrap_graaljs.js#L4 中的 GRAALJS_LOAD。

0
回答于 by

评论由:mfikes制作

尽管这从严格意义上说是一个破坏性的更改,但由于GraalJS尚未发布很长时间,因此此类更改不太可能破坏任何人。如果确实如此,可以通过覆盖默认设置来解决这个问题。

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

我没有查找,如果我们修改默认设置,这些是否会有所影响?

0
回答于 by

评论由:kommen制作

(链接:~mfikes)据我了解,更改默认选项不会影响这些变量,因为使用默认选项创建的GraalJS引擎不会用于运行由{{output-main-file}}产生的工件。但我仍然建议将这些用法更改为使用{{Java.type}}(待与Nashorn兼容),这样就可以在使用关闭{{js.java-package-globals}}的GraalJS命令行工具时,仍然可以使生成的主文件正常工作。

0

评论由:mfikes制作

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

0

评论由:mfikes制作

CLJS-3087-2.patch 已添加到补丁商店

0

评论由:mfikes制作

CLJS-3087-2.patch 得到 LGTM(是的)

0

评论由:kommen制作

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

0
_由 kamen_ 制作评论

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



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 制作评论

Dieter,我不明白你关于 jsnodejs 的最后一条评论。它们是如何受影响的?

0

由 dnolen 制作评论

我倾向于第二个补丁,该补丁禁用了隐式全局导入。无论如何都依赖于这个是很糟糕的……但另一个问题 - 我想知道我们是否应该支持 require 来导入 Java 包。

0

评论由:kommen制作

(链接: ~dnolen) GraalVM 随附一个 {{bin/js}} 和 {{bin/nodejs}} 二进制文件,两者都使用 GraalJS 引擎,但默认将 {{js.java-package-globals}} 设置为 {{true}}。因此,如果有人使用 GraalVM 的 {{nodejs}} 来运行 ClojureScript 库,他们仍会遇到带有问题前缀的命名空间问题。当然,这超出了 ClojureScript 的控制范围,但我想这为补丁提供了另一个视角,因为它并未涵盖所有可能导致此类问题的路径。

...