Clack

Revenge of Lisp in Web

Chapter 3: Hello, World!

English | 日本語

この章では、前の章で出てきた小さなプログラムをもう一度取り上げます。以下は前より少しだけ丁寧に書かれた"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を返します。