如何更改SBCL的当前目录?

z_a*_*xis 9 clisp sbcl common-lisp

这是容易改变CLISP的当前工作目录:

>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")
Run Code Online (Sandbox Code Playgroud)

但是,似乎cd在SBCL中没有类似的功能.如何用SBCL完成这项工作?

per*_*sid 12

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"
Run Code Online (Sandbox Code Playgroud)

  • 当你调用`(load ...)`时,这似乎没有改变sbcl查找的目录. (6认同)
  • @daveloyall我认为观察值得自己的顶级问题.这是令人费解的行为,我也不知道答案(我只是一直使用完整的路径名来解决它). (4认同)

小智 8

(setf *default-pathname-defaults* #P"/New/Absolute/Path/")
Run Code Online (Sandbox Code Playgroud)


小智 5

有同样的问题.结果

(setf *default-pathname-defaults* (truename "./subdir"))
Run Code Online (Sandbox Code Playgroud)

更改加载路径到subdir.如果你不想要相对路径,那么

(setf *default-pathname-defaults* (truename "/absolute/path"))
Run Code Online (Sandbox Code Playgroud)


Ale*_*nko 5

现在,更好的答案是:使用(uiop:chdir "some/path").

或者您可以使用此功能临时更改目录:

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

或者这个宏更方便:

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


z_a*_*xis 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 "$@"
Run Code Online (Sandbox Code Playgroud)

然后运行sb