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

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

Любое предложение приветствуется!


person z_axis    schedule 06.01.2012    source источник


Ответы (1)


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, описанная здесь, дополняет недостающие компоненты. из пути, указанного с помощью пути по умолчанию:

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

Изменить: это не работает для вас, потому что вы создаете путь с :name и указываете имя файла (без расширения или :type). Таким образом, когда вы вызываете merge-pathnames, он не находит отсутствующий компонент в своем пути, потому что "cgi-bin/" указан как :name (имя файла), а вы уже получили имя файла в "nav.py".

person sbenitezb    schedule 06.01.2012