2024 年 Clojure 状态调查!分享您的想法。

欢迎!请查阅关于页面以了解更多关于此页面的信息。

0
语法和读取器
编辑

大家好,

Java 的 public 类 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位服务器虚拟机(构建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.))
thresh-error/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 命令的一部分在运行,旨在围绕 repl 提供额外的工具,这就是引发错误的原因,然而在没有深入研究您的 clojure 命令实际做什么的情况下,我们无法得知。
...