奇怪的路径名?

时间:2012-01-06 00:57:02

标签: lisp common-lisp sbcl

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

任何建议都表示赞赏!

1 个答案:

答案 0 :(得分:4)

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

使用pathname函数和make-pathname:directory以及其他关键字构建:name,函数返回pathname类型的对象:

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

记录为here的函数merge-pathnames完成了使用 default-pathname 中指定的路径名所缺少的组件:

CL-USER> (merge-pathnames p "tada.txt")
CL-USER> #P"/home/test/docs/tada.txt"

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