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

欢迎!请查看关于页面以了解更多相关信息。

0投票
语法和读取器
修改

大家好,

Java 公开类 A 有公开属性 int a;当 (def a(A.)) 并且然后 (.a a) 时,错误信息 A (错误名称:a) 会显示。

为什么会有这个问题呢?

[编辑]

// 惠蠢的例子,用于演示从 Clojure 访问 A 的方式

public class A {

public int af() { return 2; }
public int af1(int x) { return x+2; }
public int a = 1;
static public int as;
static public int afs() { return 20; }
static public int afs1(int x) { return x+20; }

}

$ javac A.java
$ clojure -cp "."
user => (import A)
user => (def a (A.))
user => (def x (A.))
user => (def a1 (A.))
user => (.a a1)
1
user => (.a x)
1
user => (.a a)
执行错误 (NoClassDefFoundError) 在 java.lang.ClassLoader/defineClass1 (ClassLoader.java:-2)。
A (错误名称:a)

;; 为什么 a 不被允许?

3 答案

+1投票

如果你专门要访问该属性,需要使用 (.-a a)

0投票

您能分享一个更详细的例子吗?我不确定我是否理解了您看到的内容。

0投票

我根据上述代码尝试重现,但未能重现

% cat A.java
public class A {

public int af() { return 2; }
public int af1(int x) { return x+2; }
public int a = 1;
static public int as;
static public int afs() { return 20; }
static public int afs1(int x) { return x+20; }

}
% javac A.java
% clojure -Scp "."
Error: Could not find or load main class clojure.main
Caused by: java.lang.ClassNotFoundException: clojure.main
zsh: exit 1     clojure -Scp "."
% clojure -Sdeps '{:paths ["."]}'
Clojure 1.10.2
user=> (import A)
A
user=>  (def a (A.))
#'user/a
user=> (def x (A.))
#'user/x
user=> (def a1 (A.))
#'user/a1
user=>  (.a a1)
1
user=> (.a x)
1
user=>  (.a a)
1
user=>

看起来您的 clojure 脚本不是 tools.deps 的 clojure 脚本,因为那个没有 -cp 选项,是什么脚本以及它在启动 clojure 之外做了些什么?您的 repl 启动时也没有打印 clojure 的版本,您使用什么 repl,什么版本的 clojure?

您好 hiredman

感谢您的反馈

我在 Win10 WSL 上
 
Linux 4.4.0-19041-Microsoft #1237-Microsoft Sat Sep 11 14:32:00 PST 2021 x86_64 x86_64 x86_64 GNU/Linux

openjdk 16.0.1 2021-04-20
OpenJDK 运行环境 (构建 16.0.1+9-Ubuntu-120.04)
OpenJDK 64 位服务器 VM (构建 16.0.1+9-Ubuntu-120.04,混合模式,共享)

Clojure 1.10.1
user=>

我使用 classpath "." 运行 clojure

$ clojure -cp "."
Clojure 1.10.1
user=> (import A)
A
user=> (.a (A.))
1
user=> (def a (A.))
#'user/a
user=> (.a a)
执行错误 (NoClassDefFoundError) 在 java.lang.ClassLoader/defineClass1 (ClassLoader.java:-2)。
A (错误名称:a)

我猜可能是我的系统上 java 工具链和 clojure 之间有一些不兼容性
不是的,您运行的 `clojure` 命令可能有问题。这不是从 https://www.clojure.org/guides/getting_started 安装的 `clojure` 命令,所以我不知道它是什么以及运行了什么其他代码。我可以告诉它不是上面指南中的 clojure 命令,因为上面指南中的 clojure 命令不接受 `-cp` 标志。

可能有其他代码作为您的 Clojure 命令的一部分在运行,尝试提供额外的工具功能,这可能是导致错误的原因。然而,如果没有深入了解您的 Clojure 命令究竟在做什么,我们无法确定。
...