インタープリタ デザインパターンと 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 など)
  nil | Expression 役を実装した 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.