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)))

댓글 1개:

김재호의 디지털보단 아날로그 :

trackback from: Art of UNIX Programming - Eric S. Raymond
오픈소스나 유닉스 계열에서 꽤나 유명한 에릭 레이몬드가 쓴 책이다. 이 책의 제목만 봐서는 유닉스 프로그래밍에 대한 고급 기법들을 다룰 것 같지만, 단지 유닉스 철학만을 이야기한다. 도날드 커누스의 Art of Computer Programming의 이름을 본 따서 지었다는데, 책 주제와 상관없는데도 제목을 이렇게 지은 걸 보면 어지간히도 커누스의 Art of 시리즈가 감명 깊었는가보다.( 책 이름이던지 내용이던지 아니면 커누스 그 자체던지간에 )..