オブジェクトとは

http://ioke.org/guide.html#objects

オブジェクト

Iokeのオブジェクトモデルはとてもシンプル。Iokeでは全てがオブジェクトであり、以下のルールに従っています。オブジェクトは、以下のものを持ちます:

  • 0個以上のmimicと0個以上のcell
  • ドキュメントのテキスト
  • ネイティブデータコンポーネントIokeでは直接扱えない情報を含む、隠蔽されたcellのようなもの。例えば、Textに格納されたテキストの実体、Numberに格納された数値の実体、Regexpに格納された正規表現の実体など、プリミティブな情報を持つオブジェクトをコア型と呼ぶ。)

Iokeでは、主にcellでデータを表現します。cellは名前と値を持ち、全ての値をcellで表現します。メッセージを送信した場合、cellは自身の値を探索し、返却します。cellには全ての種類のデータを保持できます。他の言語では普通、「プロパティ」や「スロット」と呼ばれています。インスタンス変数にとても近いもので、メソッドも保持できます。cellは実行時、いつでも追加・削除できます。

mimicは親オブジェクトと呼ばれるものです。Iokeは、オブジェクトのクラス定義やオブジェクト自身の定義を必要としない、いわゆるプロトタイプベース言語です。つまり、全てのオブジェクトが別のオブジェクトの「クラス」としても利用できます。これをmimickingと言います。この種の言語には、「クラス」という意味は失っているので。オブジェクトを生成する場合、最低限として、別のオブジェクトをmimicして初期化しなければなりません。mimicなしにオブジェクトは生成できませんが、生成した後にmimicを削除することができます。mimicは追加することもでき、例えばRubyのMixin的な共有関数の表現に使えます。mimicの実際の動作としては、呼ばれたcellがそのオブジェクトに無かった場合、深さ優先で全てのmimicのcellを探索します。つまり、オブジェクトのmimicで利用可能なcellは全て、オブジェクトでも利用可能です。これにより、オブジェクト指向プログラミングの継承機能を実現しています。

あらゆる場面で、「kind」という言葉が使われます。kindとは慣例的に、主に他のオブジェクトのmimicとして使われるオブジェクトを指します。kindは名前の一文字目を大文字とし、他の文字は全て小文字とするのが慣例です。Iokeではこの慣例に従い、このような名前の場合に自動的に「kind」cellがセットされます。

以下、オブジェクトシステムの基本として用意しているkindについて。

Base

Baseは、mimicチェーンの最上位オブジェクトです。最小限のcell(cellを追加する、mimicを追加する等)が定義されているのみで、普通、Base自体をそのまま使うことはないでしょう。利用できるが他の要素を多く含まないオブジェクトが欲しい場合、Baseを使うことになります。名前空間へのアクセスが限られるので、Baseのメソッドは慎重に定義しなければなりません。自分のオブジェクト自身の名前もわかりません。Baseはテンプレートとしても使えますが、普通にオブジェクトを生成した後でmimicを削除する方法の方が無難です。

Baseには以下のcellが定義されています:

  • kind
    • このオブジェクトのkind、「Base」を返却する。
  • notice
    • このオブジェクトの短い注記、「Base」を返却する。noticeについてはIntrospectionを参照。
  • =
    • 2つの値を取り、一つ目は場所、二つめは値として、場所に値を割り当てる。Assignmentを参照。
  • ==
    • オブジェクトを引数の値と比較する。同じならばtrue、違えばfalseを返却する。
  • cell
    • 引数を一つ取り、その名前のcellが存在すれば、cell自身を実行せずに返却する。
  • cell=
    • cellに値を割り当てる。通常の割り当てモデルとして使用する。Assignmentを参照。
  • cell?
    • 指定した名前のcellが存在するか(mimicチェーンを含め)を返却する。
  • cellNames
    • オブジェクトが持つ全てのcell名のListを返却する。
  • cells
    • オブジェクトが持つ全てのcellのDictを返却する。キーは名前、値はcellの値となる。
  • documentation
    • オブジェクトのドキュメントを返却する。未定義の場合にはnilを返却する。
  • documentation=
    • オブジェクトのドキュメントをセットする。
  • mimic
    • レシーバをmimicとした、新たに生成したオブジェクトを返却する。Iokeでのオブジェクト生成の、唯一無二の魔法。

以上のメソッドは、リファンレンスでも詳しく説明されています。

Ground

上記で言及した通り、評価する際にはGroundがデフォルトの文脈となります。GroundはBaseとDefaultBehaviorをmimicとしています。トップレベルのkindが定義されている特殊な場所です。トップレベルのkindを作成したい場合、Groundに定義します。GroundにはText、Dict、List、Base、OriginやGround自身など、多くのcellが定義されています。Iokeにはグローバルなstateはありませんが、Groundは似たように使えます。Groundは通常、直接mimicとすべきではありません。

Origin

Originは、多くのIokeオブジェクトの開始地点であり、オブジェクトの基点として明確に生成されます。Origin自身にはcellは定義されませんが、Groundをmimicとしており、BaseやDefaultBehavior、Groundの全てにアクセス可能です。グローバルな関数を定義したい場合、Originに定義するのが一番でしょう。現在、Originには自身をプリントするcellのみが定義されています。

DefaultBehavior

DefaultBehaviorはmixin、つまりあるオブジェクトの唯一のmimicとなるべきではないオブジェクトです。普通、mixinはBaseには定義されず、オブジェクトに期待される多くのものは含まれていません。

DefaultBehaviorは、Iokeプログラミングで必要な、一般的なメソッドを含んでいます。リテラル表現を値に変換する内部メソッドなど、このドキュメントで説明している多くの機能を持っています。要するにDefaultBehaviorは馬車馬であって、オブジェクトにmimicチェーンを持たせない良い理由になるでしょう。GroundはDefaultBehaviorをmimicとしており、オブジェクトはOriginから生成すれば、DefaultBehaviorがmimicチェーンに加わるので。

nil, true, false

nil、true、falseの三値は、小文字ですが、kindとして扱われる値です。他のkindと違い、mimicされず、mimicしようとするとconditionが発生します。理由は、Iokeの真偽値システムはこれらを基本としているからです。これらは永遠に真偽値であるとは限りませんが、今のところは真偽値です。nilは返却値の欠落や値の欠落を表すときに使います。falseは偽であり、trueは真です。nilでもfalseでもな全ての値を真として扱うため、true値は絶対に必要というわけではありません。この真偽値判定の概念はRubyをmimicとしています。nil、false、trueのcellはGroundに定義されており、上書きしたり変更したりもできます…が、おすすめはしません。カオスと動かないプログラムがたくさん出来ることを保証します。これらの相互さようについて、詳しくはComparisonを参照のこと。

疲れた。英語力まだまだ。

Iolanguageで読み替えれば、

  • cell => slot
  • mimic => proto
  • Base & Origin & DefaultBehavior => Object
  • Ground => Lobby

という感じ…なのかな?

あ、あと、Ioke0ではJavaのライブラリ使用はできていないようです。んー、今後に期待か。