インタープリタ デザインパターンと LISP の論理的な関係。
デザインパターンの各解説書でインタープリタ デザインパターンのメタファとして「文法表現」を与えているが、 そのインタープリタ デザインパターンに対し LISP の概念との対応を与えることができる。 インタープリタ デザインパターンと LISP との論理的な関係を以下に示す。
LISP の概念による説明インタープリタ デザインパターンの概念による説明(必要なら Java 言語や Woolpack の API の用語を用いる)
静的な型が付けられたS式(多くの LISP 実装は静的型を持たないためこのように表現した)Expression 役
副作用Context 役インスタンスへの作用など
c言語や機械語で実装された関数の実装Expression 役を実装したクラスの interpret メソッド
関数Expression 役を実装したクラス
LISP 文コンストラクタツリー
defun 関数コンストラクタツリーをコンストラクタ内で定義した、 Expression 役を実装したクラス
リスト配列またはリスト(Java言語の場合は java.util.List インタフェース)
ハッシュテーブルマップ(Java言語の場合は java.util.Map インタフェース)
if 関数Expression 役を実装した分岐処理クラス(Woolpack の場合は woolpack.validator.IfValidator など)
progn 関数Expression 役を実装した順次処理クラス(Woolpack の場合は woolpack.dom.Serial など)
nilExpression 役を実装した null オブジェクト(Woolpack の場合は woolpack.dom.DomConstants#NULL など)
マクロコンストラクタツリーを生成する処理自体
LISPとの相似性により、インタープリタ デザインパターンは手続き型言語の中で関数型言語を扱うためのパターンであるといえる。

Woolpack のコンストラクタツリーを Javascript による値検証を例にして以下に示す。 根 Expression 役への参照があったり、 区切りにカンマを使用していたり、 LISP 関数に対応するクラス(new)宣言と括弧の位置が異なったり、 連想配列やリストの宣言方法が異なったりと 表現方法は異なるが、構造の相似性がかなり高いことが観察される。
var validator_tree = new BranchByIdValidator({
  "id0":new BranchByNameValidator(new AndValidatorIterable(),{
    "key0":new SerialValidator(new AndAndValidatorIterable(),[
      new IfNotValidator(new RequiredValidator(), new MessageValidator("key0 required")),
      new IfNotValidator(new MinLengthValidator(2), new MessageValidator("key0 min length")),
      new IfNotValidator(new MaxLengthValidator(4), new MessageValidator("key0 max length"))
    ]),
    "key1":new SerialValidator(new AndAndValidatorIterable(),[
      new IfNotValidator(new RequiredValidator(), new MessageValidator("key1 required")),
      new IfNotValidator(new MinLengthValidator(3), new MessageValidator("key1 min length")),
      new IfNotValidator(new MaxLengthValidator(5), new MessageValidator("key1 max length"))
    ])
  }),
  "id1":new BranchByNameValidator(new AndValidatorIterable(),{
    "key0":new SerialValidator(new AndAndValidatorIterable(),[
      new IfNotValidator(new RequiredValidator(), new MessageValidator("key0 required")),
      new IfNotValidator(new MinLengthValidator(4), new MessageValidator("key0 min length")),
      new IfNotValidator(new MaxLengthValidator(6), new MessageValidator("key0 max length"))
    ]),
    "key1":new SerialValidator(new AndAndValidatorIterable(),[
      new IfNotValidator(new RequiredValidator(), new MessageValidator("key1 required")),
      new IfNotValidator(new MinLengthValidator(5), new MessageValidator("key1 min length")),
      new IfNotValidator(new MaxLengthValidator(7), new MessageValidator("key1 max length"))
    ])
  })
});
トップに戻る
Copyright (C) 2006 Takahiro Nakamura. All rights reserved.