最近の更新 (Recent Changes)

2014-01-01
2013-01-04
2012-12-22
2012-12-15
2012-12-09

Wikiガイド(Guide)

サイドバー (Side Bar)

← 先頭のページに戻る

デカルト言語の動的なオブジェクト: オブジェクトの動的操作

1. オブジェクトの動的な定義

動的にオブジェクトを生成するためには、newObj述語を使います。

以下の例では、新しいオブジェクトabcを生成します。


 ? <newObj abc>;

2. オブジェクトの削除

オブジェクトを削除するには、delObj述語を使います。

以下の例では、前項までに定義したabcオブジェクトを削除しています。


 ? <delObj abc>;

3. メソッドの動的な定義

オブジェクト内にメソッドを追加するためには、addMethod述語を使います。

以下の例では、オブジェクトabcに対して<a> <b>;というメソッドを追加しています。


 ? ::abc <addMethod <a><b>>;

4. メソッドの削除

オブジェクト内のメソッドを削除するには、delMethod述語を使います。

以下の例では、前項で定義した<a>メソッドを削除しています。


 ? ::abc <delMethod a>;

5. インスタンス変数の動的な定義

オブジェクト内のインスタンス変数に値を設定するためには、setVar述語を使います。

以下の例では、オブジェクトabcのnumというインスタンス変数に1を設定しています。


 ?::abc <setVar num 1>;

numという変数が以前に使われていない新規の変数ならば新たに追加されます。

すでにあれば、値だけが更新されます。

6. インスタンス変数の削除

オブジェクト内のインスタンス変数を削除するには、delVar述語を使います。

以下の例では、前項で定義した変数numを削除しています。


 ? ::abc <delVar num>;

7. インスタンス配列変数の動的な定義

オブジェクト内のインスタンス配列変数に値を設定するためには、setArray述語を使います。

以下の例では、オブジェクトabcのaryというインスタンス配列変数のインデックス0にに1を設定しています。


 ? ::abc <setArray ary 1 0>;

インデックスが最後の引数になっていることに注意してください。これは、関数述語としたいために、値を先に指定するようにしています。

インデックスには、数字だけではなく任意の値を設定できます。インデックスにリストを指定すると多次元配列として使えます。 (いわゆる連想配列になっています。)


 ? ::abc <setArray ary2 "red" (car body)>;

8. オブジェクトの静的な定義

オブジェクトは以下のような形式で静的にも定義できます。


:: < オブジェクト名

  メソッド または

  inheirt 継承オブジェクト

>;

9. オブジェクトの例

例として鳥、ペンギン、鷹のオブジェクトを動的に定義する例を以下に示します。


 ? <newObj bird>;

 ? ::bird <addMethod <fly>>;

 ? ::bird <addMethod <walk>>;


 ? <newObj penguin>;

 ? ::penguin <addMethod inheirt bird>;

 ? ::penguin <addMethod <fly> <!><false>>;

 ? ::penguin <addMethod <swim>>;


 ? <newObj hawk>;

 ? ::hawk <addMethod inherit bird>;


以下を試してみましょう。

 ? ::bird <swim>;

 ? ::penguin <swim>;

 ? ::bird <walk>;

 ? ::penguin <walk>;

 ? ::bird <fly>;

 ? ::penguin <fly>;

 ? ::penguin <run>;

 ? ::hawk <fly>;

 ? ::hawk <walk>;

 ? ::hawk <swim>;

結果は以下のようになります。


 result --

   ::bird <swim>>

 -- unknown 鳥が泳ぐのか分からない



 result --

  ::penguin <swim>>

 -- true ペンギンは泳ぐ



 result --

   ::bird <walk>>

 -- true 鳥は歩く


 result --

   ::penguin <walk>>

 -- true ペンギンは歩く



 result --

   ::bird <fly>>

 -- true 鳥は飛ぶ



 result --

   ::penguin <fly>>

 -- false ペンギンは飛ばない


 result --

   ::penguin <run>>

 -- unknown ペンギンが走るか分からない


 result --

   ::hawk <fly>>

 -- true 鷹は飛ぶ


 result --

   ::hawk <walk>>

 -- true 鷹は歩く


 result --

   ::hawk <swim>>

 -- unknown 鷹が泳ぐのかわからない