2009/12/10

hunchentoot スタンドアロンで動かす

Ruby (on Rails) ばかりやっていると、とりかえしのつかないことになりそうなので、今晩は Common Lisp をする。

仕事とプライベートの切り替えは大切だよね。

ということで Common Lisp で書かれた Web サーバ hunchentoot をスタンドアロンで動かす。

Common Lisp の場合はたいてい適当な main を書いて save-lisp-and-die みたいなことをすれば実行ファイルができる。

次のコードは SBCL でのみ動く。

exe.lisp

(eval-when (:compile-toplevel :load-toplevel :execute)
(require :hunchentoot))

(defun main ()
(let ((*invoke-debugger-hook*
(lambda (condition hook)
(declare (ignore hook))
(format *error-output* "error: ~a~%" condition)
(quit :unix-status 1)))
(document-root (second *posix-argv*))
(port (third *posix-argv*)))
(print (list document-root port))
(push (hunchentoot:create-folder-dispatcher-and-handler
"/" (make-pathname :directory document-root))
hunchentoot:*dispatch-table*)
(push (hunchentoot:create-static-file-dispatcher-and-handler
"/" (make-pathname :directory document-root :name "index.html"))
hunchentoot:*dispatch-table*)
(let ((acceptor (make-instance 'hunchentoot:acceptor
:port (read-from-string port))))
(hunchentoot:start acceptor)))
(loop (sleep 777)))

(save-lisp-and-die "hunchentoot" :toplevel #'main :executable t)

;; sbcl --load exe.lisp
;; ./hunchentoot ~/www/ 1234

シェルから

sbcl --load exe.lisp
すると hunchentoot というファイルができるので、ドキュメントルートとポート番号を渡して実行する。
./hunchentoot ~/www/ 1234

あれ? ちゃんと動いたけど C-c で止まんないな。。。ま、いいか。

0 件のコメント: