2011-10-12 122 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))