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 投票
by

你能分享一个更详细的例子吗?我不确定你看到的是什么。

0 投票
by

我尝试根据上述代码进行复现,但未能成功。

% 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.depsclojure脚本,因为那个脚本是没有任何-cp选项的,这是什么脚本?除了启动clojure外,它还在做什么?你的repl在启动时也没有打印出clojure的版本,你使用的是哪个repl,什么版本的clojure

by
嗨,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
用户=>

我使用classpath "."启动clojure

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

我想,我的系统上Java工具链和Clojure之间可能存在一些不兼容。
by
不,很可能是您正在运行的 `clojure` 命令有问题。这不是从 https://www.clojure.org/guides/getting_started 安装的 `clojure` 命令,所以我无法确定是什么以及还有哪些代码正在运行。我可以确定它不是上面指南中的那个 clojure 命令,因为上面的 clojure 命令不接受 `-cp` 标志。

可能是您在 clojure 命令中运行的其他代码试图在 repl 周围提供额外的工具,这就是导致错误的原因。然而,如果我们不深入理解您的 clojure 命令实际上在做什么,我们无法确定。
...