2011-10-12 87 views
6

这是非常容易改变CLISP的当前工作目录:如何更改SBCL的当前目录?

>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来完成?

回答

1

现在我用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 "[email protected]" 

然后运行sb

+0

它比使用CHDIR更简单? – peroksid

11
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" 
+4

这似乎并不改变sbcl在调用'(load ...)'时看起来的目录。 – daveloyall

+3

@daveloyall我认为这个观察值得它自己的顶级问题。这是令人费解的行为,我也不知道答案(我只是通过全程使用完整路径来解决它)。 –

+0

你可以做'(load(concatenate'string(sb-posix:getcwd)“/”“my-foo.lisp”))'。我知道,这很笨拙,但不那么脆弱。 –

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

有同样的问题。原来

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

将负载路径更改为子目录。如果你不想相对路径,然后

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

眼下,更好的答案是:用(uiop:chdir "some/path")

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

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

还是这个宏更方便的方法:

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