この章では、前の章で出てきた小さなプログラムをもう一度取り上げます。以下は前より少しだけ丁寧に書かれた"Hello, World!"を出力するプログラムです。
(defun app (env)
(declare (ignore env))
'(200
(:content-type "text/plain")
("Hello, World!")))
(clack:clackup #'app)
appを見ればわかりますが、Clackのアプリケーションはただの関数です。アプリケーションはenvという引数を1つ受け取り、HTTP status、ヘッダ、本文の3つを含むリストを返します。
試しにこれを少し変更してみましょう。
(defun app (env)
`(200
(:content-type "text/plain")
("Hello stranger from:"
,(getf env :remote-addr))))
(clack:clackup #'app)
これはリモートアドレスを表示するコードです。もしローカルでClackを動かしている場合は通常127.0.0.1になります。envには他にも多くのHTTPの情報が含まれています。
さらに、テキストの代わりにファイルをbodyとして返すこともできます。以下はもう少し複雑にした例です。
(defun app (env)
(cond
((string= (getf env :path-info) "/favicon.ico")
'(200
(:content-type "image/x-icon")
#p"/path/to/favicon.ico"))
((string= (getf env :path-info) "/")
'(200
(:content-type "text/html")
("Hello again")))
(t '(404 (:content-type "text/plain") ("Not found")))))
(clack:clackup #'app)
このアプリケーションは、"/favicon.ico"にアクセスするとfavicon.ico、ルート(/)にアクセスすると"Hello again"、それ以外では404を返します。