странный путь? - PullRequest
       31

странный путь?

5 голосов
/ 06 января 2012
* (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 Ответ

4 голосов
/ 06 января 2012

A pathname - это структура, представляющая имя пути с использованием таких компонентов, как диск , хост , каталог , имя ,и т.д. См. здесь для получения более подробной информации.

Вы создаете pathname, используя make-pathname функцию с :directory, :name и другими ключевыми словами, и функция возвращает объектвведите pathname:

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

Функция merge-pathnames, как задокументировано здесь , завершает отсутствующие компоненты pathname , указанные с теми из 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".

...