* (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**

我正在使用sbcl-1.0.54。

任何建议表示赞赏!

最佳答案

pathname是使用驱动器,主机,目录,名称等组件表示路径名的结构。有关更多详细信息,请参见here

使用带有pathnamemake-pathname和其他关键字的:directory函数构造:name,该函数返回pathname类型的对象:

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

如所记录的here所示,函数merge-pathnames完成了默认路径名中指定的路径名​​所缺少的部分:
CL-USER> (merge-pathnames p "tada.txt")
CL-USER> #P"/home/test/docs/tada.txt"

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

10-08 05:59