Lisp 使用相对路径加载文件

Lisp 使用相对路径加载文件,lisp,common-lisp,Lisp,Common Lisp,我正在尝试使用相对路径从同一目录中的文件加载Lisp中的文件 我的文件结构如下所示: repo/ subdir/ main.lisp test.lisp 在main.lisp中,我有许多函数定义,在test.lisp中,我想测试函数 我曾尝试在test.lisp中使用(load“main.lisp”)和(load“main”),以及路径名上的许多变体(即,在文件名之前包括/),但两次都出现以下错误(其中是传递给加载函数的文件名): 函数LISP::INT

我正在尝试使用相对路径从同一目录中的文件加载Lisp中的文件

我的文件结构如下所示:

repo/
    subdir/
        main.lisp
        test.lisp
main.lisp
中,我有许多函数定义,在
test.lisp
中,我想测试函数

我曾尝试在
test.lisp
中使用
(load“main.lisp”)
(load“main”)
,以及路径名上的许多变体(即,在文件名之前包括
/
),但两次都出现以下错误(其中
是传递给加载函数的文件名):

函数LISP::INTERNAL-LOAD:“”中的文件错误不存在。

是否可以使用相对路径加载
main.lisp


值得注意的是,我正在使用Sublime Text 3内部运行和执行代码。

加载文件时,变量
*LOAD-PATHNAME*
绑定到加载文件的路径名,而
*LOAD-TRUENAME*
绑定到其TRUENAME

因此,要加载与当前加载的文件位于同一目录中的文件,您可以说

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

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“


通常,要重用上述内容,需要将其转换为实用程序函数…

这是否仅在加载的文件中包含时才起作用?我尝试通过REPL执行此操作,但
*load truename*
的值为
nil
。但是,当我使用
(load“path to test.lisp”)
时,它确实起作用。是的,
*load truename*
仅在
加载
操作期间绑定。类似地,有
*编译文件路径名*
*编译文件truename*
仅在执行
编译文件
期间绑定。