2014-09-12 11 views
6

Sto provando a caricare un file in Lisp da un file nella stessa directory utilizzando un percorso relativo.Carica file con un percorso relativo

mia struttura dei file simile a questo:

repo/ 
    subdir/ 
     main.lisp 
     test.lisp 

In main.lisp Ho un certo numero di definizioni di funzioni, e in test.lisp voglio testare le funzioni.

Ho provato con (load "main.lisp") e (load "main") in test.lisp, così come una serie di variazioni sul percorso (cioè, tra ./ prima del nome), ma entrambe le volte ottengo il seguente errore (dove <filename> è il nome del file passato al funzione di caricamento):

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

E 'possibile caricare main.lisp utilizzando un percorso relativo?

Può valere la pena di notare che io sono in esecuzione CMUCL e l'esecuzione del codice utilizzando SublimeREPL all'interno del Sublime Text 3.

risposta

8

Quando un file viene caricato, la variabile *LOAD-PATHNAME* è legato al percorso del file caricato e *LOAD-TRUENAME* al suo nome.

Così, per caricare un file nella stessa directory con il file attualmente in fase di caricamento, si può dire risposta

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

sarà questo solo lavoro quando contenuta in un file viene caricato? Ho provato a farlo tramite REPL, ma il valore di * * load-truename * 'era' nil'. Tuttavia, ha funzionato quando ho usato '(carica" ​​path-to-test.lisp ")'. – maxdeviant

+1

Sì, '* load-truename *' è associato solo durante un'operazione 'load'. Allo stesso modo, ci sono '* compile-file-pathname *' e '* compile-file-truename *' che sono vincolati solo durante l'esecuzione di 'compile-file'. – jlahd

4

di jlahd è eccellente.

Se avete bisogno di fare diversi calcoli nome di un percorso, è possibile farlo con le funzioni built-in:

(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 

Il risultato: #P"/Users/joswig/Documents/Lisp/test.lisp".

solito di riutilizzare qualcosa di simile in precedenza, uno trasformarlo in una funzione di utilità ...