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 命令,因为该命令不接受 `-cp` 标志。

可能有一些其他代码作为您 clojure 命令的一部分运行,试图为 repl 提供额外的工具支持,这就是抛出错误的原因。然而,在没有深入了解您的 clojure 命令具体做了什么之前,我们无法得知。
...