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

1 に答える 1

4

Aは、 drivehostdirectorynameなどpathnameのコンポーネントを使用してパス名を表す構造体です。詳細については、こちらを参照してください。

、およびその他のキーワードpathnameを使用して usingmake-pathname関数を作成すると、関数はタイプ のオブジェクトを返します。:directory:namepathname

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

ここ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」でファイル名を取得しているため、呼び出し時にパス名に欠落しているコンポーネントが見つかりません。

于 2012-01-06T02:14:44.533 に答える