2012-01-06 11 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を使用しています。奇妙なパス名?

ご迷惑をおかけして申し訳ございません。 pathname

答えて

4

は詳しくhereを見る等ドライブホストディレクトリ、同様に、コンポーネントを使用してパス名を表す構造です。

あなたは:directory:nameおよび他のキーワードでmake-pathname機能を使用して、関数がタイプpathnameのオブジェクトを返しますpathnameを構築:の不足しているコンポーネントが完了し、

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

機能merge-pathnamesを文書化hereとしてパス名は、のデフォルトパス名で指定されています。

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

[ファイルとファイルI/O](http://www.gigamonkeys.com/book/files-and-file-io.html)のPCLの章の最後も参照してください。 – Daimrod