Previous: , Up: コンポーネント   [Contents][Index]


7.2.3 新しいコンポーネント型を定義する

新しいコンポーネント型を作るには、既存のコンポーネントのサブクラスを作り、新しいクラスに特定化されたメソッドを定義します。

例を見てみましょう。あなたのシステムは処理系依存の機能をいくつか備えています。あなたは、それらのソースファイルを1つの(サポートする)Lisp処理系ごとに1つのサブディレクトリに隔離したいと考えました。まずはcl-source-fileのサブクラスを定義しましょう。

(defclass unportable-cl-source-file (cl-source-file)
  ()
  (:documentation "処理系依存のLispソースファイル"))

サブディレクトリの名前は、asdf:implementation-type(バージョン2.014.14以降でエクスポートされています)の返り値を使うことにします。あとは、unportable-cl-source-fileのパス名を推論する仕組みを加えるだけです。

(defmethod component-pathname ((component unportable-cl-source-file))
  (merge-pathnames*
    (parse-unix-namestring (format nil "~(~A~)/" (asdf:implementation-type)))
    (call-next-method)))

これで完了です。新しいコンポーネント型は、defsystemフォーム中で次のように使われます:

(defsystem :foo
    :components
    ((:file "packages")
     ...
     (:unportable-cl-source-file "threads"
      :depends-on ("packages" ...))
     ...
    ))