+// Schemeにおける環境の提供
+//
+// Schemeにおける「環境」の定義を行います。
+// Schemeの一つの環境に対応するEnvironmentが提供され、Scheme中の
+// 環境はEnvironmentのスタックによって表現されます。
+//
+// Environmentは、data::Objectを名前によってmapしており、これは
+// Schemeにおける変数の束縛に対応します。
+//
+// example
+// -------
+//
+// Environment e;
+// smart_ptr<data::Object> o(new data::Object);
+// e.Set("hoge", o);
+// e.Get("hoge")
#ifndef _ENVIRONMENT_H_
#define _ENVIRONMENT_H_
namespace interpreter {
class Environment {
- // Scheme中の「環境」とされる束縛の集合を表す。
- // 親となる環境へのポインタを保持し、順に束縛を検索していく。
- // 束縛は文字列をキーとしたObjectのmapで表現され、
- // 実際の利用に際しては、Literalのsymbolから取得できる文字列を
- // 元にしてアクセスを行う。
+ // Scheme中の「環境」とされる束縛の集合を表します。
+ // data::Objectと対応する変数名を対で管理し、変数名による
+ // 対応するオブジェクトへのアクセスを提供します。
+ //
+ // データの入れ替えについては、data::Object型の参照が返される
+ // ため、この参照について変更を行う、もしくは該当するメソッド
+ // を利用してください。
+ //
+ // また、Schemeにおける環境の親子関係をシームレスに行います。
+ // 親を持つEnvironmentは、保持している対の中に検索対象の
+ // 変数名が見つからない場合、親の環境の探索を行います。
public:
Environment();
+ // 親となる
explicit Environment(const smart_ptr<Environment>& parent);
virtual ~Environment() {}
- // 指定した名前にObjectを束縛する。
- void append(const std::string& key, smart_ptr<data::Object> obj);
+ // strに関連付けられたobjを取得します。
+ // objが存在しない場合、falseを返します。falseが返された場合、
+ // objはisNull()==trueとされます。
+ bool Get(const std::string& str, smart_ptr<data::Object>* obj);
- // 基本的にはこれのみでアクセスできるようにする。
- // 存在しない束縛にアクセスした場合には、isNullがNULLとなる
- // smart_ptrを返す(つまりはNULLオブジェクト)
- smart_ptr<data::Object> operator[](const std::string& str);
+ // strにobjを関連づけます。まだ関連づけられていない場合には、
+ // 渡されたobjが新規に関連づけられ、すでにstrに関連づけられている
+ // data::Objectが存在する場合には、渡されたobjで置換されます。
+ bool Set(const std::string& str, const smart_ptr<data::Object>& obj);
private:
- smart_ptr<data::Object> find(const std::string& str);
+ // 渡された変数名に対応するオブジェクトを保持している対の集合
+ // から検索します。
+ // 保持している対の集合に、該当する変数名が見つからない場合、
+ // 親が存在している場合には親を検索します。
+ // 最終的にオブジェクトが見つからない場合、返されたsmart_ptrは
+ // isNull() == trueとなります。
+ smart_ptr<data::Object> FindObject(const std::string& str);
- std::map<std::string, smart_ptr<data::Object> > bind_;
+ // 変数名をキーとして、オブジェクトを関連付けたmapです。
+ std::map<std::string, smart_ptr<data::Object> > object_bind_;
- // 現在の環境の親となる環境。
+ // ç\8f¾å\9c¨ã\81®ç\92°å¢\83ã\81®è¦ªã\81¨ã\81ªã\82\8bç\92°å¢\83ã\81§ã\81\99ã\80\82
smart_ptr<Environment> parent_;
};
};