레이블이 Lisp인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Lisp인 게시물을 표시합니다. 모든 게시물 표시

2010년 10월 21일 목요일

quicklisp 좋네

http://www.quicklisp.org/

유사한놈들이 몇가지 있지만 윈도우에서 쓰긴 어려워서 수작업으로 다운받는 식으로 쓰곤 했는데 저놈은 윈도에서도 그럴듯하게 돌아간다. 잘 기억해두자.

2010년 2월 13일 토요일

clozure common lisp 세팅

그냥 몇가지 적어둔다.

  1. 뜰때 읽는 파일이 ccl-init.lisp 인데 내가 환경변수 HOME 을 잡아둔 곳에서 읽지 않고 내문서 그쪽에서 읽는다. $HOME 읽는 프로그램들 중(*nix 쪽에서 나온 놈들)에 이렇게 돌아가는건 처음보네. 아.. 허긴 이놈은 mac 출신이구나. 어쨌건 ccl 띄운후 (user-homedir-pathname) 를 확인해보면 알수있다.
  2. 위 경로에 ccl-init.lisp 을 만들고 아래 코드로 c:/opt/lisp 아래의 asdf 패키지들을 찾도록 했다. 아래 코드는 http://paste.lisp.org/display/83926 에서 가져온것
    (require 'asdf)
    (defun setup-registry (directory-path)
    (format t "; adding components under ~A to asdf registry~%" directory-path)
    (mapc (lambda (asd-pathname)
    (pushnew (make-pathname :name nil
    :type nil
    :version nil
    :defaults asd-pathname)
    asdf:*central-registry*
    :test #'equal))
    (directory (merge-pathnames #p"**/*.asd" directory-path))))
    (setup-registry #p"c:/opt/lisp/")
  3. asdf-install 이 지원되는 모양인데.. 난 수작업을 하는편.
  4. http://read-eval-print.blogspot.com/2009/06/clozure-cl-windows.html 를 보면 인코딩 세팅하는 코드도 나와있다. 지금은 그냥 돌려본거라 이건 테스트 안해봤는데 한글윈도에서 코딩하려면 반드시 필요하겠지. 파일인코딩은 euc-kr, 그외는 utf-8 식으로..
    (setf ccl:*default-external-format*
    (ccl:make-external-format :character-encoding :utf-8
    :line-termination :dos)
    ccl:*default-file-character-encoding* :utf-8
    ccl:*default-socket-character-encoding* :utf-8)

패키지 몰아서 받는건 아래 링크 통해서 하고있다. libcl 자체가 패키지관리기능을 가지고 있지만 난 그냥 저거 압축만 풀어서 쓰고있는 상태.
http://libcl.com/

2009년 5월 14일 목요일

성능좋은 common lisp 정규식 라이브러리 cl-irregsexp

이거 뭐 내가 이걸 쓸리는 업고 그냥 웹에서 놀다 보이길래 적어둔다.
전에 어디선가 cl-ppcre 가 런타임에 컴파일을 하기 때문에 속도가 조낸 빠르다는 소릴 들었는데 여기에 나온 벤치에 의하면 그렇지 못하네... 음 벤치가 너무 단순해서 그런가.

이 벤치는 다양한 패턴이 적용되지는 않은것 같지만 그냥 흥미있길래 적어둔다.

http://common-lisp.net/project/cl-irregsexp/


음 적는김에 링크 몇개 더 적어본다. 언젠가 읽어볼날이 오겠지. 오려나?

2009년 2월 26일 목요일

emacs 기반 개발환경을 제공하는 common lisp 로그라이크 엔진

RLX: a cross-platform graphical roguelike engine

emacs 를 저렇게도 활용하네.
스샷에 보이는 cell 모드가 이 http://www.emacswiki.org/emacs/CellMode 셀모드인가 아님 따로 만든건가.. 어쨌건 셀모드 사이트는 링크가 지금 죽은 상태.

그외 걸린 링크들도 그럴싸해보이길래 적어둔다.

소스는 아직 안받아보고 스샷만 구경한 상태..
그런데 플레이어 입장으로 보면 별로 재미있어 보이는 스샷은 아니네. 낄낄

2008년 11월 11일 화요일

UPNP 로 공유기 찾고 포트매핑 추가하기. lisp(SBCL 전용) 예제

아 시바 정말 귀찮네.
이넘들이 망할 soap 을 쓰는 바람에 C 로 짜긴 귀찮은 존재구나.
libupnp 까지 붙이고 싶지는 않고.. 내가 지금 하려는거에 굳이 soap 결과를 파싱까지 하고 싶지는 않고.. 그래서 간단히 upnp 기능만 돌려보는 테스트 스크립트를 만들어봤다. slime 상에서 여러가지 경우로 테스트 해보기 위해서 lisp 으로 만들었고 lisp 으로 udp 쏘는건 처음이라 소스를 적어둔다.

아래 소스 로딩하고 (discover-gateway) 부르면 같은 망 내의 공유기를 찾아서(하나라고 가정) control url 을 *control-url* 에 담기게 되고, 그상태에서 (test/blahblah) 함수들을 적절히 불러가면서 공유기가 무슨짓을 하는지 보면 된다.

그런데 포트매핑을 추가한상태에서 또 추가한다거나, 다른 어플리케이션이 이미 포트 뚫어논 상태에서 내가 같은 포트로 뚫으려고 한다거나.. 내 어플이 뒤지고 다시 깨서 이미 뚫린걸 다시 뚫으려고 한다거나.. 내가 뚫어논걸 다른 색히가 가로챈다거나.. 음.. 테스트할 경우의수가 좀 많구나... 아무래도 문서를 읽어봐야 할거 같군. 걍 미리 만들어둔 xml 뿅 쏘고 넘길려고 했는데 그리 쉽게는 안되겠네?? 지금 아래 구현체는 upnp 하나도 모르고 그냥 빗토런트의 upnp 구현체를 보고 따라친거 뿐인데 이정도 테스트 만으로 넘어가긴 좀 그렇구나.

문서좀 읽고 libupnp 를 검토해봐야겠구나.. 후랄.

아 그리고 당연한 말이지만 아래 코드는 테스트용으로 만든거라 여러 가정을 깔고 있고 환경이 바뀌면 안돌아갈수 있다.. 나중에 기억못할테니 적어두자면.. 로컬 IP 가 *local-ip-address* 에 상수로 박혀있고 udp 쏘고 소켓 읽는 부분이 블러킹으로 리딩하기 때문에 만약 같은 망 내에 공유기가 없으면 마냥 블러킹 되고.. find-location-blahblah 함수내의 정규식 패턴에 ^M 이 \r 제어문자 라는거.. 이맥스에서는 C-Q C-M 으로 입력이 가능한데 다른 에디터는 모르겠다. 나중에 다시 필요하면 여기서 긁어붙일텐데 이때 ^M 주의하자.



소스보기..





2008년 10월 24일 금요일

common lisp 에서 \r\n, crlf 의 표현 방법 ( usocket 을 이용한 간단한 http call 예제 )

;;; \r\n 이 자주 쓰이는 표현인데 common lisp 에서는 \r\n 식으로
;;; 표현하면 그냥 이스케이프 되서 못알아먹고 #\Return #\Newline 등으로
;;; 나타내야 되는데 lisp 을 자주 쓰는것도 아니고 어쩌다 한번 쓸려고
;;; 하면 매번 까먹길래 적어둔다.
;;;
;;; 참고로 sbcl 에선 아래결과가 나오는데
;;; (char-code #\Return) -> 13
;;; (char-code #\Linefeed) -> 10
;;; (char-code #\Newline) -> 10
;;; 이게 표준인지는 잘 모르겠다 특히 라인피드와 뉴라인 캐릭터가 같이
;;; 있는건 좀 애매하군. 설마 플래폼마다 Newline 값이 달라지는건가?
;;;
;;; 아래 예제는 usocket 을 이용해서 간단히 http request 를 날려보는
;;; 예제. \r\n 을 스트림으로 쏘는 함수를 만들어서 이용을 했는데 굳이
;;; 이렇게 안하고 format 에서 ~C~C 로 하고 #\Return #\Linefeed 을 대줘도
;;; 된다.
;;;

(require 'usocket)
(use-package :usocket)

(declaim (inline crlf))
(defun crlf (s)
(check-type s stream)
(write-char #\Return s)
(write-char #\Linefeed s))

;;; crlf 함수를 통해서
(with-client-socket (sock stream "www.live.com" 80)
(format stream "GET / HTTP/1.0")
(crlf stream)
(crlf stream)
(force-output stream)
(loop
for buf = (read-line stream nil)
while buf
do (print buf)))


;;; format 에서 바로 써봤다. \r\n 처럼 format 안쪽에서 바로 표현하는
;;; 방법은 모르겠네
(with-client-socket (sock stream "www.live.com" 80)
(format stream "GET / HTTP/1.0~C~C~C~C" #\Return #\Linefeed #\Return #\Linefeed)
(force-output stream)
(loop
for buf = (read-line stream nil)
while buf
do (print buf)))

2008년 9월 8일 월요일

hunchentoot 한글(유니코드) 출력하기

전에도 고민했던 문제였는데 다시 만나게 되서 삽질을 또 해봤는데

이번에 한 삽질 보기


헐 시바 그런데 존내 간단한 해결방법이 있었네
http://osdir.com/ml/lisp.html-template.general/2007-05/msg00004.html
예전엔 왜 못봤지?


그래서 위 코드를 적용하고 나니 위의 foo 와 baz 가 이렇게 간단히 변했다.

(setf hunchentoot:*hunchentoot-default-external-format* :UTF-8)

(defun foo ()
"한글")
(defun baz ()
(let ((s (send-headers)))
(fill-and-print-template (create-template-printer "안녕 <!-- TMPL_VAR world -->")
'(:world "세상")
:stream s)))


아 쉬바...