Clack

Revenge of Lisp in Web

Chapter 5: コンポーネント

English | 日本語

実を言うと、僕は第3章で1つ嘘をついていました。--Clackのアプリケーションはただの関数です。-- 正直に言えば、アプリケーションは必ずしも関数ではありません。以下の例を見てください。

;; 分かりやすさのためにシンボルをimportしておきます
(import '(clack:call clack:))

(defclass <sample-app> (<component>) ())

(defmethod call ((this <sample-app>) env)
  (declare (ignore env))
  '(200
    (:content-type "text/plain")
    ("Hello, Clack!")))

(clack:clackup
  (make-instance '<sample-app>))

前に見たものととても似ていませんか? 関数の中身はメソッドcallに移動し、clackupには<sample-app>のインスタンスを渡しています。

まとめるなら、clackupはアプリケーションとして、関数か、<component>のサブクラスのインスタンスを受け取ることができます。すべてのコンポーネントには、リクエストごとに呼び出されるメソッドcallがある必要があります。

まだ、これをどのように扱えばいいのかわからないかもしれませんが、実例は後ほど取り上げます。ここではただ、clackupにCLOSインスタンスも渡せる、ということだけ覚えておいてください。