2014-09-12 3 views
6

J'essaye de charger un fichier dans Lisp à partir d'un fichier dans le même répertoire en utilisant un chemin relatif.Charger le fichier avec un chemin relatif

Ma structure de fichier ressemble à ceci:

repo/ 
    subdir/ 
     main.lisp 
     test.lisp 

En main.lisp j'ai un certain nombre de définitions de fonctions, et test.lisp je veux tester les fonctions.

J'ai essayé d'utiliser (load "main.lisp") et (load "main") à test.lisp, ainsi qu'un certain nombre de variations sur le chemin (par exemple, y compris ./ avant le nom du fichier), mais les deux fois que je reçois l'erreur suivante (où <filename> est le nom de fichier transmis à la fonction de la charge):

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

Est-il possible de charger main.lisp en utilisant un chemin relatif?

Il est intéressant de noter que je courais CMUCL et l'exécution du code à l'aide SublimeREPL à l'intérieur du texte Sublime 3.

Répondre

8

Lorsqu'un fichier est en cours de chargement, la *LOAD-PATHNAME* variable est liée au chemin du fichier chargé , et *LOAD-TRUENAME* à son nom de fichier.

Donc, pour charger un fichier dans le même répertoire avec le fichier actuellement en cours de chargement, vous pouvez dire que la réponse de

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

Est-ce que cela ne fonctionne que si contenu dans un fichier en cours de chargement? J'ai essayé d'exécuter ceci par le REPL, mais la valeur de '* load-truename *' était 'nil'. Cependant, cela a fonctionné quand j'ai utilisé '(load" path-to-test.lisp ")'. – maxdeviant

+1

Oui, '* load-truename *' est uniquement lié lors d'une opération 'load'. De même, il existe '* compile-file-pathname *' et '* compile-file-truename *' qui ne sont liés que pendant l'exécution de 'compile-file'. – jlahd

4

jlahd est excellent.

Si vous devez effectuer plusieurs calculs pathname, vous pouvez le faire avec les fonctions intégrées:

(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 

Le résultat: #P"/Users/joswig/Documents/Lisp/test.lisp".

Habituellement réutiliser quelque chose comme ci-dessus, un tour dans une fonction d'utilité ...

Questions connexes