Reputation: 1179
I am trying to load a file in Lisp from a file in the same directory using a relative path.
My file structure looks like this:
repo/
subdir/
main.lisp
test.lisp
In main.lisp
I have a number of function definitions, and in test.lisp
I want to test the functions.
I have tried using (load "main.lisp")
and (load "main")
in test.lisp
, as well as a number of variations on the pathname (i.e., including ./
before the filename) but both times I get the following error (where <filename>
is the filename passed to the load function):
File-error in function LISP::INTERNAL-LOAD: "<filename>" does not exist.
Is it possible to load main.lisp
using a relative path?
It may be worth noting that I am running CMUCL and executing the code using SublimeREPL inside of Sublime Text 3.
Upvotes: 10
Views: 5452
Reputation: 139241
jlahd's answer is excellent.
If you need to make different pathname calculations, you can do it with the built-in functions:
(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
The result: #P"/Users/joswig/Documents/Lisp/test.lisp"
.
Usually to reuse something like above, one turn it into a utility function...
Upvotes: 5
Reputation: 6293
When a file is being loaded, the variable *LOAD-PATHNAME*
is bound to the pathname of the file being loaded, and *LOAD-TRUENAME*
to its truename.
So, to load a file in the same directory with the file currently being loaded, you can say
(load (merge-pathnames "main.lisp" *load-truename*))
Upvotes: 11