2009년 4월 1일 수요일

LispIDE - 가볍게 쓸 수 있는 Windows 용 Lisp editor

Windows 환경에서 Lisp으로 간단한 코드를 작성하고 간편하게 실행해볼 수 있는 프로그램을 소개해드립니다. 물론 Emacs + SLIME 궁합이 상당히 강력하긴 하지만, 몇 줄 안되는 짧은 코드를 작성하고 실행해보는 데 그 무거운 Emacs를 실행하기는 좀 부담스러울 때가 있습니다.(저만 그런가요?) 그래서 뭔가 대체할 만한 것이 없을까 찾아보다가 발견하게 된 것이 바로 LispIDE입니다. 아마도 Common Lisp이나 Scheme 공부를 막 시작하시는 분들에게 특히 유용할 것 같네요.


LispIDE 특징을 살펴보면,
  • Lisp과 Scheme 소스에 대한 구문 강조(Syntax Highlighting) 지원
  • SBCL, CLISP, Corman Lisp 등 대부분의 commandline Lisp과 Scheme 구현체 지원
  • 편집창에 다중 탭 지원
  • 간편한 REPL 기능 제공 (Lisp 표현식을 손쉽게 전송)
  • 커서 키로 제어 가능한 편리한 history 기능 제공
  • CHM 형식의 HyperSpec, CLtL2 포함
  • Lisp 재시작 버튼 제공
LispIDE는 무료로 사용 가능한 freeware이고 소스도 함께 공개되어 있습니다. 홈페이지에 darcs 저장소에서 내려받을 수 있는 방법을 친절하게 알려주고 있습니다. :)

잡담.
최근 Windows 상에서 Emacs 23 CVS + SLIME CVS 궁합으로 SBCL을 연결해 사용해보면 약간의 문제가 있더군요. REPL buffer 상에서 입력한 표현식에 에러가 발생하면 그 다음부터 SBCL과 Emacs 사이의 pipeline에 문제가 생겨 더 이상 표현식이 전달되지 않는 현상이 생깁니다. CLISP은 별 문제가 없어서 당분간은 CLISP을 사용하려고 하는데, 속도면에서 월등한 SBCL을 쓰지 못하는 게 좀 아쉽습니다. 좋은 해결 방법 아시는 분 안계세요? :-$

2009년 3월 31일 화요일

[Common Lisp] 로또(Lotto) 번호 생성기

먹고 살기 점점 힘들어져서 이래저래 한숨만 나오는 요즘입니다. 그래서, 혹시나 하는 기대로 로또를 해보기도 하는데, 이건 그때 쓸려고 Common Lisp으로 만든 로또 번호 생성 장난감 코드입니다. 번호를 하나씩 뽑을 때마다 난수 발생 방식으로 수 배열을 섞어줍니다.
(defun random-comp (a b)
(if (= (random 2) 1) t nil))

(defun take-random (lst n mixcnt)
(cond ((null lst) ())
((<= n 0) ())
(t
(let ((nlst
(dotimes (cnt mixcnt lst)
(setq lst (sort lst #'random-comp)))))
(cons (car nlst) (take-random (cdr nlst) (1- n) mixcnt))))))

(defun gen-lotto-seq (mixcnt)
(let ((lst (loop for i from 1 to 45 collect i)))
(take-random lst 6 mixcnt)))

(defun gen-lotto-helper (try mixcnt)
(if (<= try 0)
nil
(cons
(let ((lst (gen-lotto-seq mixcnt)))
(print lst)
(print (apply #'+ lst))
(finish-output)
(sort lst #'<))
(gen-lotto-helper (1- try) mixcnt))))

(defun gen-lotto (try &optional (mixcnt 1000))
(setq *random-state* (make-random-state t))
(gen-lotto-helper try mixcnt))

실행 방법)
(gen-lotto <시도할 게임 수 번호> <하나를 뽑을 때마다 수열을 섞는 회수, 기본값 1000>)

예)
(gen-lotto 5 500) ; 총 5 게임을 시도하고, 각 번호를 뽑을 때마다 500 번씩 섞음
(gen-lotto 3) ; 총 3 게임을 시도하고, 각 번호를 뽑을 때마다 1000 번씩 섞음


아래는 실제로 실행해본 스크린샷입니다.



주의.
이 코드로 인해 발생할 수 있는 정신적 스트레스 및 물질적 궁핍 또는 결여에 대해 저는 어떠한 책임도 지지 않습니다. 단, 이 코드로 인해 발생한 물질적 형태의 이익에 대해 사례를 하시겠다면 마다 하지는 않겠습니다. ;-)