如何更改SBCL的当前目录?

16

更改CLisp的当前工作目录非常容易:使用函数cd即可。

>cat ~/.clisprc.lisp 
;;; The following lines added by ql:add-to-init-file:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
  (load quicklisp-init)))

(cd "/media/E/www/qachina/db/doc/money")
(load "money")

然而,在SBCL中似乎没有类似于cd的函数。如何在SBCL中实现这个功能?

5个回答

17
CL-USER> (sb-posix:chdir "/home/apugachev")
0
CL-USER> (sb-posix:getcwd)
"/home/apugachev"
CL-USER> (sb-posix:chdir "/tmp/")
0
CL-USER> (sb-posix:getcwd)
"/tmp"

10
当您调用(load ...)时,这似乎并不会改变sbcl查找目录的位置。 - daveloyall
5
我认为这个观察结果值得单独提出一个问题来探讨。这是令人困惑的行为,我也不知道答案(我只是一直使用完整路径名来解决它)。 - Reb.Cabin
你可以直接执行(load (concatenate 'string (sb-posix:getcwd) "/" "my-foo.lisp"))。虽然有点笨拙,但相对不太容易出错。 - Reb.Cabin

15
(setf *default-pathname-defaults* #P"/New/Absolute/Path/")

这是正确的答案。 - undefined

10

目前,更好的答案是:使用(uiop:chdir "some/path")

或者您可以使用此函数暂时更改目录:

(uiop:call-with-current-directory "some/path" (lambda () (do-the-job))

或者使用此宏更方便:

(uiop:with-current-directory ("some/path") (do-the-job))


注意:uiop包在大多数CL实现中直接可用,无需使用asdf / quicklisp加载。上述代码将直接运行。 - Capstone
1
我在Windows中使用SBCL 2.0.0,必须(require "asdf")才能使用uiop。事实上,不需要安装任何东西。 - Heitor Chang

8

我有同样的问题。 结果是

(setf *default-pathname-defaults* (truename "./subdir"))

将加载路径更改为子目录。如果您不想使用相对路径,则

(setf *default-pathname-defaults* (truename "/absolute/path"))

0

现在我使用rlwrap来运行SBCL并解决了这个问题

$"cat ~/bin/sb"
breakchars="(){}[],^%$#@\"\";:''|\\"

cd /media/E/www/qachina/db/doc/money/
exec rlwrap --remember -c -b "$breakchars"  -f "$HOME"/.sbcl_completions sbcl "$@"

然后运行sb


1
使用chdir更简单吗? - peroksid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接