2014-09-12 2 views
6

Я пытаюсь загрузить файл в Lisp из файла в том же каталоге, используя относительный путь.Загрузить файл с относительным путем

Моя файловая структура выглядит следующим образом:

repo/ 
    subdir/ 
     main.lisp 
     test.lisp 

В main.lisp У меня есть ряд определений функций, и в test.lisp я хочу протестировать функции.

Я попытался с помощью (load "main.lisp") и (load "main") в test.lisp, а также ряд вариаций на имя пути (то есть, в том числе ./ перед именем файла), но оба раза я получаю следующее сообщение об ошибке (где <filename> имя файла передается в функция загрузки):

File-error in function LISP::INTERNAL-LOAD: "<filename>" does not exist.

можно ли загрузить main.lisp используя относительный путь?

Может быть, стоит отметить, что я бегу CMUCL и выполнения кода с использованием SublimeREPL внутри Sublime Text 3.

ответ

8

Когда файл грузили, переменная *LOAD-PATHNAME* связана с именем пути из файла, загружаемого , и *LOAD-TRUENAME* на свое имя.

Таким образом, чтобы загрузить файл в том же каталоге с файлом в настоящее время загружен, вы можете сказать, ответ

(load (merge-pathnames "main.lisp" *load-truename*)) 
+0

Будет ли это работать только, если они содержатся в файле загружаемой? Я попытался выполнить это через REPL, но значение '* load-truename *' было 'nil'. Однако он работал, когда я использовал '(load" path-to-test.lisp ")'. – maxdeviant

+1

Да, '* load-truename *' привязан только во время операции 'load'. Точно так же есть '* compile-file-pathname * и' * compile-file-truename * ', которые связаны только во время выполнения' compile-file'. – jlahd

4

jlahd превосходен.

Если вам нужно сделать различные вычисления имени каталога, вы можете сделать это с встроенными функциями:

(let* ((p1 (pathname "test.lisp")) ; not fully specified 
     (name1 (pathname-name p1))  ; the name "test" 
     (type1 (pathname-type p1))  ; the type "lisp" 
     (p2 #p"/Users/joswig/Documents/bar.text") ; a complete pathname 
     (dir2 (pathname-directory p2))) ; (:ABSOLUTE "Users" "joswig" "Documents") 

    ; now let's construct a new pathname 

    (make-pathname :name name1 
       :type type1 
       :directory (append dir2 (list "Lisp")) ; we append a dir 
       :defaults p2))   ; all the defaults 
             ; relevant when the filesystem supports 
             ; host, device or version 

Результат: #P"/Users/joswig/Documents/Lisp/test.lisp".

Обычно для повторного использования что-то вроде выше, один превратить его в функцию полезности ...

Смежные вопросы