2014-09-12 7 views
6

Ich versuche, eine Datei in Lisp aus einer Datei im selben Verzeichnis mit einem relativen Pfad zu laden.Datei mit einem relativen Pfad laden

Meine Dateistruktur sieht wie folgt aus:

repo/ 
    subdir/ 
     main.lisp 
     test.lisp 

In main.lisp Ich habe eine Reihe von Funktionsdefinitionen und in test.lisp möchte ich die Funktionen testen.

Ich habe versucht, (load "main.lisp") und (load "main") in test.lisp verwenden, sowie eine Reihe von Variationen auf dem Pfad (dh einschließlich ./ vor dem Dateinamen), aber beide Male habe ich die folgende Fehlermeldung erhalten (wo <filename> der Dateiname an die übergebene Ladefunktion):

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

Ist es möglich, main.lisp mit einem relativen Pfad zu laden?

Es kann sich lohnen, unter Hinweis darauf, dass ich CMUCL leite und die Ausführung von Code mit SublimeREPL innerhalb von Sublime Text 3.

Antwort

8

Wenn eine Datei geladen wird, wird die Variable *LOAD-PATHNAME* auf den Pfad der gebundenen Datei geladen und *LOAD-TRUENAME* zu seinem truename.

also eine Datei im selben Verzeichnis mit der Datei laden zur Zeit geladen, können Sie

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

wird dies nur funktionieren, wenn sie in einer Datei geladen enthalten? Ich habe versucht, dies über die REPL auszuführen, aber der Wert von '* load-truename *' war 'nil'. Es hat jedoch funktioniert, wenn ich '(load" path-to-test.lisp ")' verwendet habe. – maxdeviant

+1

Ja, '* load-truename *' ist nur während einer 'load' Operation gebunden. Ebenso gibt es '* compile-file-pathname *' und '* compile-file-truename *', die nur während der Ausführung von 'compile-file' gebunden werden. – jlahd

4

jlahd sagen Antwort ist ausgezeichnet.

Wenn Sie verschiedene Pfadnamen Berechnungen vornehmen müssen, können Sie es mit den integrierten Funktionen machen:

(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 

Das Ergebnis: #P"/Users/joswig/Documents/Lisp/test.lisp".

der Regel so etwas wie oben wieder zu verwenden, man es in eine Nutzenfunktion drehen ...

Verwandte Themen