使用相对路径加载文件

时间:2014-09-12 03:32:07

标签: lisp common-lisp

我正在尝试使用相对路径从同一目录中的文件加载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执行代码。

2 个答案:

答案 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"

通常要重复使用上述内容,将其转换为实用功能......