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
by

如果您确实想访问属性,则需要使用(.-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` 命令有问题。这个 `clojure` 命令不是从 https://www.clojure.org/guides/getting_started 安装的,因此我不确定到底是什么以及还有其他代码在运行。我可以说它不是上面的指南中的 clojure 命令,因为上面的指南中的 clojure 命令不接受 `-cp` 标志。

可能是您的 Clojure 命令中正在运行某些其他代码,试图为 repl 提供额外的工具,这就是引发错误的原因,但是我们无法确定您的 Clojure 命令实际在做什么。
...