OSDN Git Service

google testをテスティングライブラリとして利用することに決定。
[simplecms/utakata.git] / src / environment.h
index a2f4f4d..0b29618 100755 (executable)
@@ -1,3 +1,19 @@
+// 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_
 
@@ -14,32 +30,48 @@ class Object;
 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_;
 };
 };