当我在探索Clojure时,一个问题困扰了我很长一段时间。我尝试通过在Clojure脚本上调用REPL中的compile
函数来生成一个类,如下所示:
(ns mylib.DirLister (:gen-class))
(defn -listDir [this path]
(->> path java.io.File. .listFiles (map #(.getName %))))
我将此脚本保存到 e:/temp/clj/src/mylib/DirLister.clj 。当我为-cp
选项指定相对路径时,以下会话顺利进行,即在类路径中成功生成类:
e:\temp\clj>java -cp .\src;.\classes;d:/tools/clojure-1.4.0/clojure-1.4.0.jar clojure.main
Clojure 1.4.0
user=> (compile 'mylib.DirLister)
mylib.DirLister
user=>
但是当我使用绝对路径时,会出现“没有这样的文件或目录”错误:
e:\>java -cp e:/temp/clj/src;e:/temp/clj/classes;d:/tools/clojure-1.4.0/clojure-1.4.0.jar clojure.main
Clojure 1.4.0
user=> (compile 'mylib.DirLister)
CompilerException java.io.IOException: No such file or directory, compiling:(mylib/DirLister.clj:1)
user=>
为什么?我的意思是为什么绝对路径不起作用,但相对路径不起作用。
我知道我可以和莱宁根一起去。但是因为我正在学习Clojure,所以在采用这个功能齐全的工具之前,我想了解其中的内容。
答案 0 :(得分:2)
在我看来,在命令行中混合使用正斜杠和反斜杠。我不确定你正在使用什么样的外壳,以及这是否会产生影响。但是,e:中的路径通常需要反斜杠'\'。也许这会有所帮助,或至少消除一个潜在的问题根源?
您是否可以尝试更改第二个示例以使用
e:\temp\clj\src;e:\temp\clj\classes;d:\tools\clojure-1.4.0\clojure-1.4.0.jar
看看是否有帮助?
答案 1 :(得分:1)
最后我得到了答案:
compile
函数将始终使用内置变量*compile-path*
的值作为输出类的路径,如果未设置,则默认为当前目录下的“类”否则。所以我遇到的问题不是关于相对路径或绝对路径,而是关于当前目录和*compile-path*
的值。
请参阅ClojureDoc。