2012-01-06 98 views
5
* (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。奇怪的路徑名?

任何建議表示讚賞!

回答

4

pathname是使用組件,如驅動主機目錄等。參見here更多細節表示一個路徑名的結構。

您使用make-pathname函數:directory:name和其他關鍵字pathname構建體,並且該函數返回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」中獲得了一個文件名。

+0

另請參閱PCL關於[文件和文件I/O](http://www.gigamonkeys.com/book/files-and-file-io.html)一章的結尾。 – Daimrod 2012-01-06 09:56:15