(sb-posix:chdir)和(加载)

时间:2015-09-18 20:56:43

标签: common-lisp sbcl

为什么sb-posix:chdir似乎没有改变(truename ".")(load ...)关于cwd的想法?

CL-USER> (sb-posix:getcwd)
"directory-B"
CL-USER> (sb-posix:chdir "directory-A")
0
CL-USER> (sb-posix:getcwd)
"directory-A"
CL-USER> (truename ".")
#P"directory-B"
CL-USER> (sb-posix:chdir "/tmp")
0
CL-USER> (truename ".")
#P"directory-B"
CL-USER> (load "some-file-under-dirA.asd")
; Evaluation aborted on #<SB-INT:SIMPLE-FILE-ERROR "~@<Couldn't load ~S: file does not exist.~@:>" {CE86631}>.

1 个答案:

答案 0 :(得分:2)

sb-posix repository上有一些广告:

A few functions in sb-posix don't correspond directly to their C
counterparts.

让我们来看看getcwd:

来自here

  

getcwd()函数应该放置当前的绝对路径名   buf指向的数组中的工作目录,并返回buf。该   复制到数组的路径名不应包含任何组件   象征性的联系。 size参数是以字节为单位的大小   buf参数指向的字符数组。如果buf为null   指针,getcwd()的行为未指定。

如果我们在粘液中或repository

获得此功能的帮助
  

“以字符串形式返回进程的当前工作目录。”

这里的问题是SBCL当前的directoy固定在特殊变量中:

*default-pathname-defaults*

这就是为什么当你打电话给truename和“。” SBCL向您显示该变量内的当前目录,该变量不受调用sb-posix:chdir的影响,它真正改变了sb-posix环境或posix进程。如果你想更改SBCL目录(你可以使用slime,cd然后输入新目录),你可以按照以下步骤进行操作,但要小心,因为你正在修改一个包含路径名的特殊变量,例如它不会适用于粘液(我已经展示过的命令):

╭─anquegi@toshiba-debian  ~/learn/lisp/StackOverFlow/testDirs ‹ruby-2.2.1@laguna› 
╰─$ tree                                                                                                                                        148 ↵
.
├── dirA
└── dirB
    └── factorial.lisp

2 directories, 1 file

然后让我们搞砸了

; SLIME 2015-06-01
CL-USER> (sb-posix:getcwd)
"/home/anquegi/learn/lisp/StackOverFlow/testDirs"
CL-USER> *default-pathname-defaults*
#P"/home/anquegi/learn/lisp/StackOverFlow/testDirs/"
CL-USER> (sb-posix:chdir "dirB")
0
CL-USER> (sb-posix:getcwd)
"/home/anquegi/learn/lisp/StackOverFlow/testDirs/dirB"
CL-USER> *default-pathname-defaults*
#P"/home/anquegi/learn/lisp/StackOverFlow/testDirs/"
CL-USER> (setf *default-pathname-defaults* (sb-ext:native-pathname (format nil "~A~A" (sb-posix:getcwd) "/"))) 
#P"/home/anquegi/learn/lisp/StackOverFlow/testDirs/dirB/"
CL-USER> (load "factorial")
T
CL-USER> (factorial 3)
6

请注意转换路径名中的字符串并添加“/”,我不知道为什么SBCL采用这种方式工作。将sb-posix与sbcl路径分开

相关问题