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


请参阅这里了解有关GraalJS REPL选项的更多信息
0

评论者:kommen

使用{{js.java-package-globals}}一样可以解决问题,因为提供了更多的顶级域名(TLDs)作为包、java、javafx、javax、com、org、edu,这将修复这些TLDs的使用。正如Mike所指出的,这将对依赖这些全局变量在Graal环境运行的人员造成破坏性更改。

0

评论者: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

评论者: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}},以便可以在关闭{{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

在(链接: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

评论者:kommen

(链接: ~dnolen) GraalVM 包含了一个 {{bin/js}} 和 {{bin/nodejs}} 可执行文件,它们都使用 GraalJS 引擎,但默认将 {{js.java-package-globals}} 设置为 {{true}}。因此,如果某人使用 GraalVM 的 {{nodejs}} 运行 ClojureScript 项,他们仍然会遇到有关具有问题前缀的名称空间的麻烦。当然,这是 ClojureScript 无法控制的,但我认为这从另一个角度看待了补丁,因为它并未涵盖所有可能导致此问题的路径。

...