什么是__FILE__的Clojure等价物(在Ruby& Perl中找到)

时间:2010-10-20 23:06:42

标签: clojure

在ruby中,我经常使用File.expand_path(File.dirname(__FILE__))来加载包含测试数据的配置文件或文件。现在我正在尝试在我的clojure应用程序中加载一些html文件进行测试,如果没有硬编码文件的完整路径,我无法弄清楚如何做到这一点。

编辑: 我正在使用leinigen,如果这有任何帮助

ref:__ FILE__是一个特殊文字,它返回执行时给程序的文件名(包括任何路径)。见(rubydoc& perldata

4 个答案:

答案 0 :(得分:13)

*file*

API Reference(将*file*添加到网址)

答案 1 :(得分:9)

这是在Clojure中复制它的一种方法:

(defn dirname [path]
  (.getParent (java.io.File. path)))

(defn expand-path [path]
  (.getCanonicalPath (java.io.File. path)))

然后你在Clojure中的Ruby行File.expand_path(File.dirname(__FILE__))就是这样:

(expand-path (dirname *file*))

请参阅Java interop docs了解.getParent& .getCanonicalPath


NB。我认为*file*总是返回Clojure中的绝对(虽然不是规范)路径名/文件名。而__FILE__返回执行时提供的路径名/文件名。但是我不认为这些差异会影响你的尝试吗?

/ I3az /

答案 2 :(得分:7)

9点解决方案都不正确。 * file *为您提供相对于类路径的文件。在* file *上使用.getCanonicalPath或.getAbsolutePath将为您提供一个不存在的文件。正如this old thread中所指出的,您需要使用ClassLoader来正确解析* file *。这是我用来获取当前文件的父目录的内容:

(-> (ClassLoader/getSystemResource *file*) clojure.java.io/file .getParent)

答案 3 :(得分:0)

根据user83510上面的回答,完整的答案是:

(def path-to-this-file 
  (clojure.string/join "/" [(-> (ClassLoader/getSystemResource *file*) clojure.java.io/file .getParent) (last (clojure.string/split *file* #"/"))]))

它不漂亮但它有效:P