奇怪的路径名?

z_a*_*xis 5 lisp sbcl common-lisp

* (make-pathname :name "cgi-bin/")
#P"cgi-bin/"
* (merge-pathnames "nav.py" #P"cgi-bin/")
#P"cgi-bin/nav.py"    ; **it is ok**
* (merge-pathnames "nav.py" (make-pathname :name "cgi-bin/"))
#P"nav.py"            ; why ?

*(defvar bp #P"/media/E/myapp/cgi-bin/")
* bp
#P"/media/E/myapp/cgi-bin/")
* (merge-pathnames "nav.py" bp)
#P"nav.py"            ; why ?
* (merge-pathnames "nav.py" #P"/media/E/myapp/cgi-bin/")
#P"/media/E/myapp/cgi-bin/nav.py"    ; **it is ok**
Run Code Online (Sandbox Code Playgroud)

我使用的是sbcl-1.0.54.

任何建议表示赞赏!

sbe*_*ezb 4

Apathname是一个使用组件表示路径名的结构,如drivehostdirectoryname等。请参阅此处了解更多详细信息。

您可以使用,和其他关键字构造一个pathnameusingmake-pathname函数,该函数返回一个类型为 的对象::directory:namepathname

CL-USER> (defvar p (make-pathname :directory '(:absolute "home" "test" "docs")))
CL-USER> #P"/home/test/docs/"
Run Code Online (Sandbox Code Playgroud)

此处merge-pathnames记录的函数会补全使用default-pathname中指定的路径名​​的缺失部分:

CL-USER> (merge-pathnames p "tada.txt")
CL-USER> #P"/home/test/docs/tada.txt"
Run Code Online (Sandbox Code Playgroud)

编辑:它对您不起作用,因为您正在使用:name和 构建路径名,指定文件名(不带扩展名或:type)。因此,当您调用merge-pathnames它时,在其路径名中找不到缺少的组件,因为“cgi-bin/”被指定为:name(文件名),并且您已经在“nav.py”中获得了文件名。