2011-10-12 31 views
6

Đó là rất dễ dàng để thay đổi thư mục làm việc hiện tại CLISP của:Làm thế nào để thay đổi thư mục hiện tại của 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") 

Tuy nhiên, có vẻ như không có cd chức năng tương tự trong SBCL. Làm thế nào điều này có thể được thực hiện với SBCL?

Trả lời

1

Bây giờ tôi sử dụng rlwrap để chạy SBCL và giải quyết vấn đề này

$"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]" 

sau đó chạy sb.

+0

là nên đơn giản hơn sử dụng 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

Điều này dường như không thay đổi thư mục mà sbcl nhìn vào khi bạn gọi '(tải ...)'. – daveloyall

+3

@daveloyall Tôi nghĩ rằng quan sát là giá trị của câu hỏi cấp cao nhất của chính nó. Đó là hành vi khó hiểu và tôi không biết câu trả lời, hoặc là (tôi chỉ làm việc xung quanh nó bằng cách sử dụng tên đường dẫn đầy đủ tất cả các thời gian). –

+0

bạn chỉ có thể làm '(chuỗi tải (ghép nối '(sb-posix: getcwd)"/"" my-foo.lisp "))'. Khá vụng về, tôi biết, nhưng một chút ít giòn. –

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

Đã cùng một câu hỏi. Biến ra

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

thay đổi đường dẫn tải xuống thành tiểu mục. Nếu bạn không muốn đường dẫn tương đối, thì

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

Ngay bây giờ, câu trả lời tốt hơn là: sử dụng (uiop:chdir "some/path").

Hoặc bạn có thể sử dụng chức năng này để thay đổi thư mục tạm thời:

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

Hoặc macro này cho cách thuận tiện hơn:

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

Các vấn đề liên quan