请在 2024 年 Clojure 问卷调查! 中分享您的看法。

欢迎!请参阅 关于 页面以了解更多有关此内容的信息。

0 投票
REPL
重新分类

我按照
https://clojure.org/guides/getting_started#_installation_on_linux

的说明安装了 clojure。然而,当我在 ~ 中启动 repl 时,我得到了以下错误

线程 "main" 中发生异常 java.lang.IllegalStateException: 尝试调用未绑定函数:#'clojure.main/main

    at clojure.lang.Var$Unbound.throwArity(Var.java:45)
    at clojure.lang.AFn.invoke(AFn.java:28)
    at clojure.lang.AFn.applyToHelper(AFn.java:152)
    at clojure.lang.AFn.applyTo(AFn.java:144)
    at clojure.lang.Var.applyTo(Var.java:705)
    at clojure.main.main(main.java:40)

如果我将目录更改为任何其他位置,则运行正常

:~/src$ clj
Clojure 1.10.3
user=>

我的操作系统是 Debian Buster (Minimal)... 我试图查找,但无果...

不确定以下信息是否有帮助...

:~$ mvn --version
Apache Maven 3.6.0
Maven 安装目录:/usr/share/maven
Java 版本:11.0.11,供应商:Debian,运行时:/usr/lib/jvm/java-11-openjdk-amd64
默认地区:en_IN,平台编码:UTF-8
操作系统名称:"linux",版本:"4.19.0-17-amd64",体系结构:"amd64",家族:"unix"

:~$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK 运行环境(构建 11.0.11+9-post-Debian-1deb10u1)
OpenJDK 64 位服务器 VM(构建 11.0.11+9-post-Debian-1deb10u1,混合模式,共享)

4 个答案

+1 投票

选择了
 
最佳答案

~中有一个src文件夹吗?如果是,里面有什么?(我在想你是否有一个src/user.clj文件,并且该脚本中有某些脚本导致崩溃)

:~$ ls -al src/
total 48
drwxr-xr-x 12 nalin nalin 4096 Jul 11 16:15 .
drwxr-xr-x 29 nalin nalin 4096 Jul 15 11:32 ..
drwxr-xr-x  2 nalin nalin 4096 Jul 14 17:23 clojure
drwxr-xr-x  3 nalin nalin 4096 Jun 27 20:44 elm
drwxr-xr-x  2 nalin nalin 4096 Jul 11 21:36 erlang
drwxr-xr-x  2 nalin nalin 4096 Jun 30 14:51 haskell
drwxr-xr-x 12 nalin nalin 4096 Jul  9 23:03 klipse
drwxr-xr-x  4 nalin nalin 4096 Feb 14 22:19 lfe
drwxr-xr-x  2 nalin nalin 4096 Mar 25 14:43 lisp
drwxr-xr-x  5 nalin nalin 4096 Jul  3 17:42 mongodb
drwxr-xr-x  2 nalin nalin 4096 Jul 10 20:58 ocaml
drwxr-xr-x  3 nalin nalin 4096 Jul 13 20:53 sml
:~$ ls -al /usr/local/lib/clojure/
total 20
drwxr-xr-x  3 root root 4096 Jul 13 18:09 .
drwxr-xr-x 15 root root 4096 Jul  9 22:45 ..
-rw-r--r--  1 root root  458 Jul 13 18:09 deps.edn
-rw-r--r--  1 root root 1489 Jul 13 18:09 example-deps.edn
drwxr-xr-x  2 root root 4096 Jul 13 18:09 libexec
:~$ ls -al /usr/local/lib/clojure/libexec/
总计 14596
drwxr-xr-x 2 root root     4096 Jul 13 18:09 .
drwxr-xr-x 3 root root     4096 Jul 13 18:09 ..
-rw-r--r-- 1 root root 14932202 Jul 13 18:09 clojure-tools-1.10.3.855.jar
-rw-r--r-- 1 root root     2955 Jul 13 18:09 exec.jar
这一条可能有所帮助... 我希望如此.... 如果有用,请也帮助我理解...

:~$ su
密码
root@ranjan-t410:/home/nalin# cd ~
root@ranjan-t410:~# clj
Clojure 1.10.3
user=>
root@ranjan-t410:~# cd /home/nalin/
root@ranjan-t410:/home/nalin# clj
root@ranjan-t410:/home/nalin#
在 src/clojure 中有什么内容?那就是导致你问题的原因。

默认情况下,clj/clojure 会查找 src 以寻找命名空间,由于你有 src/clojure,这会对应到以 clojure.something 开头的命名空间。

将那个 src 文件夹重命名为 source,我敢打赌你的问题就会消失(你可能需要使用 clj -Sforce 来获取 REPL,以强制重新计算类路径缓存等)。

编辑了
我将我的实践项目放在 ~/src 目录下,因此大部分相关的 clojure 实践程序都会在 ~/src/clojure 中。

你说得对……我将 "src" 改成了 "source",而且确实有一个 REPL 在那里...

:~$ clj
Clojure 1.10.3
user=>

好的...

不过有一点好奇心,这种情况会发生在我尝试从一个包含 "src" 文件夹的任何目录中启动 clj 的情况下吗? 我已经在 stackoverflow 上提出了同样的问题,并希望可以将你的回复作为答案链接到那里...
好吧,只要在你的 src 文件夹中,并且有一个与你要运行的命名空间对应的 Clojure 源文件的路径,这种情况都有可能发生。

例如,如果你有 src/elm/test.clj,那么如果你启动一个 REPL 并执行 (require '[elm.test]),Clojure 会尝试加载这个文件。

如果你有 src/haskell/project/Stuff.hs 并且你启动一个 REPL 并尝试执行 (require '[haskell.project.foo]),Clojure 会寻找名为 foo.clj(或 foo.cljc)的文件,在 src/haskell/project/ 目录下。

这是因为 Clojure 项目通常都有 src 文件夹(以及,经常还有 test 文件夹——但通常你通过别名将其添加到路径中,例如 clj -A:test 和 :test 别名将拥有 :extra-paths ["test"] ——现在 Clojure 会同时在 src 和 test 文件夹中查找。
0 投票

你好,

  • 你能分别在 ~ 目录和 ~/src 目录中提供 which clj 的输出吗?

  • 你能提供 env 的输出吗?

:~$ which clj
/usr/local/bin/clj

:~/src$ which clj
/usr/local/bin/clj


******* 在 ~ 目录中 env 的输出结果 **********************
SHELL=/bin/bash
WINDOWID=6291469
XTERM_VERSION=XTerm(344)
LANGUAGE=en_IN:en
XTERM_SHELL=/bin/bash
XDG_SEAT=seat0
PWD=/home/nalin
LOGNAME=nalin
XDG_SESSION_TYPE=tty
XAUTHORITY=/home/nalin/.Xauthority
WINDOWPATH=1
HOME=/home/nalin
LANG=en_IN
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36
INVOCATION_ID=7de1bed7edfb43d2989c032722a9aab6
XTERM_LOCALE=en_IN
XDG_SESSION_CLASS=user
TERM=xterm
USER=nalin
DISPLAY=:0.0
SHLVL=2
XDG_VTNR=1
XDG_SESSION_ID=1
XDG_RUNTIME_DIR=/run/user/1000
JOURNAL_STREAM=9:21181
HUSHLOGIN=FALSE
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
MAIL=/var/mail/nalin
_=/usr/bin/env
OLDPWD=/home/nalin/src

***********************************************

***********************************在 ~/src 目录中 env 的输出结果 **************************
SHELL=/bin/bash
WINDOWID=6291469
XTERM_VERSION=XTerm(344)
LANGUAGE=en_IN:en
XTERM_SHELL=/bin/bash
XDG_SEAT=seat0
PWD=/home/nalin/src
LOGNAME=nalin
XDG_SESSION_TYPE=tty
XAUTHORITY=/home/nalin/.Xauthority
WINDOWPATH=1
HOME=/home/nalin
LANG=en_IN
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36
INVOCATION_ID=7de1bed7edfb43d2989c032722a9aab6
XTERM_LOCALE=en_IN
XDG_SESSION_CLASS=user
TERM=xterm
USER=nalin
DISPLAY=:0.0
SHLVL=2
XDG_VTNR=1
XDG_SESSION_ID=1
XDG_RUNTIME_DIR=/run/user/1000
JOURNAL_STREAM=9:21181
HUSHLOGIN=FALSE
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
MAIL=/var/mail/nalin
_=/usr/bin/env
OLDPWD=/home/nalin
0 投票

你能在 ~ 目录中创建新目录吗?(特别是 ~/.cpcache) 我们有一个已知问题,不能创建目录会导致问题,不确定这与此是否有关。 https://clojure.atlassian.net/browse/TDEPS-119

尝试不使用 exec
静默退出...
exec 会用启动的 java 进程替换当前进程(你的终端 shell),因此你不想在命令行中这么做。但是,你确实可以在那里获得 repl。

我无法解释你所看到的现象。可能与 bash 本身或有关于主目录的权限有关,但不清楚具体是什么或者如何进一步调试。
我的机器上 repl 并不是不能用... 除了 ~ 之外的其他目录都行。甚至能在 Emacs 中运行东西... 所以这对我来说不是障碍...

我想分享一下,以防你们觉得需要执行更多的步骤,请告诉我,如果我分享执行的结果有帮助的话... 但我只是觉得有点尴尬...

你还有什么其他的 shell 想让我尝试,除了 bash 之外吗?顺便说一句,我试了 "sh -x clojure",但它给了我这个...
:~$ sh -x clojure
sh: 0: 无法打开 clojure
我认为这并不是 shell 问题... 但这只是一个直觉...
0 投票

我也想知道在 ~ 中 clj -Spath 的输出结果。显然,Clojure 本身并没有被添加到类路径中。如果你有 ~/.clojure/deps.edn,也可以尝试将其移开。

:~$ clj -Spath
src:/home/nalin/.m2/repository/org/clojure/clojure/1.10.3/clojure-1.10.3.jar:/home/nalin/.m2/repository/org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar:/home/nalin/.m2/repository/org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar

我是否应该尝试删除 ~/.clojure/deps.edn ??
不确定以下信息是否有帮助...

:~$ mvn --version
Apache Maven 3.6.0
Maven 安装目录:/usr/share/maven
Java 版本:11.0.11,供应商:Debian,运行时:/usr/lib/jvm/java-11-openjdk-amd64
默认地区:en_IN,平台编码:UTF-8
操作系统名称:"linux",版本:"4.19.0-17-amd64",体系结构:"amd64",家族:"unix"


:~$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK 运行环境(构建 11.0.11+9-post-Debian-1deb10u1)
OpenJDK 64 位服务器 VM(构建 11.0.11+9-post-Debian-1deb10u1,混合模式,共享)
...