Что такое Clojure-эквивалент __FILE__ (встречается в Ruby & Perl) - PullRequest
10 голосов
/ 21 октября 2010

В ruby ​​я часто использую File.expand_path(File.dirname(__FILE__)) для загрузки конфигурационных файлов или файлов с тестовыми данными. Прямо сейчас я пытаюсь загрузить некоторые html-файлы для теста в моем приложении clojure и не могу понять, как это сделать без жесткого кодирования полного пути к файлу.

редактировать: Я использую leinigen, если это поможет каким-либо образом

ref: __FILE__ - это специальный литерал , который возвращает имя файла (включая любой путь), данное программе при выполнении. см. ( rubydoc & perldata )

Ответы [ 4 ]

13 голосов
/ 21 октября 2010
*file*

Справочник по API (добавьте *file* к URL)

9 голосов
/ 21 октября 2010

Вот один из способов повторить это в Clojure:

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

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

Тогда ваша строка Ruby File.expand_path(File.dirname(__FILE__)) в Clojure будет такой:

(expand-path (dirname *file*))

См. Java interopдокументы для .getParent & .getCanonicalPath.


Примечание.Я думаю, что *file* всегда возвращает абсолютный (хотя и не канонический) путь / имя файла в Clojure.Принимая во внимание, что __FILE__ возвращает путь / имя файла, предоставленные при исполнении.Однако я не думаю, что эти различия должны влиять на то, что вы пытаетесь сделать?

/ I3az /

7 голосов
/ 16 июля 2012

Ни одно из 9-ти точечных решений не является правильным. * file * дает вам файл относительно пути к классам. Использование .getCanonicalPath или .getAbsolutePath в * file * даст вам несуществующий файл. Как указано в этой старой теме , вам нужно использовать ClassLoader для правильного разрешения * файла *. Вот что я использую, чтобы получить родительский каталог текущего файла:

(-> (ClassLoader/getSystemResource *file*) clojure.java.io/file .getParent)
0 голосов
/ 09 февраля 2014

Основываясь на ответе user83510 выше, полный ответ:

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

Это не красиво, но работает: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...