我正在尝试使用相对路径从同一目录中的文件加载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并使用Sublime Text 3中的SublimeREPL执行代码。
答案 0 :(得分:9)
当加载文件时,变量*LOAD-PATHNAME*
绑定到正在加载的文件的路径名,并*LOAD-TRUENAME*
绑定到其文件名。
因此,要将文件加载到当前正在加载的文件的同一目录中,您可以说
(load (merge-pathnames "main.lisp" *load-truename*))
答案 1 :(得分: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"
。
通常要重复使用上述内容,将其转换为实用功能......