SBCL 소스를 커맨드 프롬프트에서 스크립트처럼 실행 시에, 특수 변수 *posix-argv*를 사용하여 실행 파라미터(인자)를 리스트의 형태로 가져올 수 있다.


아래와 같이 example.lisp을 작성한다.

(print *posix-argv*)


실행 파라미터를 주어 실행해보면, 

sbcl --script example.lisp enter your argument


("sbcl" "enter" "your" "argument")


첫번째 요소로 SBCL 실행 파일명을 가지며, 나머지에 실행 파라미터가 포함된 리스트가 출력되는 것을 볼 수 있다.




<테스트 환경>

OS : Windows 7

SBCL 버전 : 1.2.7


,

SBCL에서 디렉토리 내의 파일/디렉토리 리스트를 가져오는 방법입니다. (sb-posix, sb-grovel을 사용한 방법)


1. 디렉토리 리스트 가져오기


(require :sb-posix)
(require :sb-grovel)

(defun is-directory (pathname) ; 주어진 경로가 디렉토리인지 체크한다
  (ignore-errors
    (sb-posix:s-isdir (sb-posix:stat-mode (sb-posix:lstat pathname)))
    )
  )

(defun get-directory-contents (pathname) ; 주어진 경로 내의 모든 디렉토리/파일 리스트를 얻는다
  (let ((dir (sb-posix:opendir pathname)))
    (prog1
      (loop for dirent = (sb-posix:readdir dir)
           until (sb-grovel::foreign-nullp dirent)
           unless (or (equal (sb-posix:dirent-name dirent) ".")
                      (equal (sb-posix:dirent-name dirent) ".."))
           collect (concatenate 'string pathname "/"
                                (sb-posix:dirent-name dirent)))
      (sb-posix:closedir dir))
    )
  )

(defun get-dirs (dir) ; 주어진 경로 내의 모든 디렉토리 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리가 아닌 항목을 제거한다)
  (remove-if-not #'is-directory (get-directory-contents dir))
  )


(defparameter dir-list nil)

(setq dir-list (get-dirs ".")) ; 현재 디렉토리 내의 디렉토리를 가져와 DIR-LIST에 저장한다


(dolist (dir dir-list) ; DIR-LIST의 내용을 출력한다
  (print dir)
  )




2. 파일 리스트 가져오기


(require :sb-posix)
(require :sb-grovel)

(defun is-directory (pathname) ; 주어진 경로가 디렉토리인지 체크한다
  (ignore-errors
    (sb-posix:s-isdir (sb-posix:stat-mode (sb-posix:lstat pathname)))
    )
  )

(defun get-directory-contents (pathname) ; 주어진 경로 내의 모든 디렉토리/파일 리스트를 얻는다
  (let ((dir (sb-posix:opendir pathname)))
    (prog1
      (loop for dirent = (sb-posix:readdir dir)
           until (sb-grovel::foreign-nullp dirent)
           unless (or (equal (sb-posix:dirent-name dirent) ".")
                      (equal (sb-posix:dirent-name dirent) ".."))
           collect (concatenate 'string pathname "/"
                                (sb-posix:dirent-name dirent)))
      (sb-posix:closedir dir))
    )
  )

(defun get-dirs (dir) ; 주어진 경로 내의 모든 디렉토리 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리가 아닌 항목을 제거한다)
  (remove-if-not #'is-directory (get-directory-contents dir))
  )

(defun get-files (dir) ; 주어진 경로 내의 모든 파일 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리인 항목을 제거한다)
  (remove-if #'is-directory (get-directory-contents dir))
  )

(defparameter file-list nil)

(setq file-list (get-files ".")) ; 현재 디렉토리 내의 파일 리스트를 가져와 FILE-LIST에 저장한다


(dolist (file-item file-list) ; FILE-LIST의 내용을 출력한다
  (print file-item)
  )




<테스트 환경>

OS : Windows 7

Emacs 버전 : Emacs 24.3 윈도우용

SBCL 버전 : 1.2.7

Slime 버전 : 2.21


,

파일에 저장된 SBCL 소스를 커맨드 프롬프트에서 스크립트처럼 실행할 수도 있다.


sbcl.exe --script <filename>



아래와 같이 배치파일로 저장해두어도 된다.


runcl.bat :

sbcl.exe --script %1



<테스트 환경>

OS : Windows 7

SBCL 버전 : 1.2.7


,

Emacs에서 Emacs Lisp가 아닌 Common Lisp 구현체 중 하나인 SBCL을 사용하기 위한 방법을 간단히 정리해보았습니다.


1. 다운로드 주소


SBCL : http://www.sbcl.org/

Slime : http://common-lisp.net/project/slime/


2. 설치 순서


1) SBCL을 설치한다. (스페이스가 포함되지 않은 경로에 설치한다)

2) Slime 압축을 푼 폴더를 <Emacs 설치 경로>/site-lisp 밑에 위치시킨다.

3) .emacs 파일에 다음과 같은 내용을 추가한다. (경로명을 적을 때 \가 아닌 /를 사용하는 것에 유의)


(setq inferior-lisp-program "C:/sbcl/sbcl.exe")
(add-to-list 'load-path "C:/emacs-24.3/site-lisp/slime-master/")
(require 'slime)
(slime-setup)



이제 M-x slime을 입력하면 slime buffer가 뜨면서 SBCL을 사용할 수 있습니다.






<테스트 환경>

OS : Windows 7 (32bit)

Emacs 버전 : Emacs 24.3 윈도우용

SBCL 버전 : 1.2.7

Slime 버전 : 2.21


,