Io言語:オブジェクトシステム



はじめに



ioについて書き続けることは、この素晴らしい舌のオブジェクトシステムのデバイスに個別に住むことが絶対に必要です。 主な問題は、OOPを「知っている」場合でも、ioでどのように機能するかを単純に理解できない状況が存在する可能性があることです。 現在、何らかの理由で、OOPはJavaモデルを意味します。 C ++はOOPパラダイムをサポートする言語であるため、オブジェクト指向言語と呼ぶことはできませんが、これはその主要なパラダイムではありません。 Javaは、b-OOP言語の誇りあるタイトルにはより適していますが、問題は、Javaに似た言語によって口述されるOOPがかなり歪んでいることです。 当初、OOPの原理はSmalltalkに由来し、すべてが少し異なって見えました。オブジェクトはメソッドを呼び出すことによって互いに通信するのではなく、メッセージを互いに渡すことによって、なぜこのモデルを残したのか疑問に思っています。松葉杖のない舌の透明な平行。 今日のクールな並列言語、たとえば同じErlangを見てください。すべてはメッセージによって行われます。 繰り返しになりますが、RPC、COM、およびその他のdbus'aの山の多い庭です。 しかし、それがすべてうまくいった方法。





プロトタイプOOP



私たちは、OOPがクラス上に構築されているという事実に何らかの形で慣れています。 クラスはタイプの説明であり、オブジェクトはクラスのインスタンスです。 一般に、このようなモデルは、ロジックとデータを分離する困難なタスクで非常によく証明されていますが、プログラムにさらに混乱を加えています。 クラス自体だけでなく、クラスのすべてのインスタンスに留意する必要があります。 もちろん、問題は議論の余地があり、古典的な「クラスオブジェクト」モデルに出くわす欲求はありませんが、プロトタイプの利点については引き続き話したいと思います。



プロトタイプを見てみましょう。簡単に言えば、 最初の記事で構造を説明しましたが、念のため、思い出させてください。 この言語のプロトタイプでは、型宣言とデータの分離に関連するクラス、クラスのインスタンスなどの概念はなく、ioにはオブジェクトのみが存在します。 オブジェクトには常に独自のインスタンスがあります(ロシア語でどのようになりますか?)、古いオブジェクトを複製し、そのプロパティを変更し、必要なスロットを追加/削除することにより、新しいオブジェクトを取得できます。 したがって、げっ歯類の群れをすぐに殺します。そのプロパティ/メソッドを使用できるアクティブオブジェクトがあり、それは子孫のプロトタイプ(「クラス宣言」)でもあります。 非常に遠い(まあ、非常に遠い)このような構造は静的クラスに似ています。



常に存在するオブジェクト



インタプリタを起動するとすぐに、いくつかの「グローバル」オブジェクトが利用可能になります。おそらく最も重要なものは次のとおりです。



最初のオブジェクトにはランタイムが含まれ、いわば実行されたコードの足元の地面です。 2番目はクローン作成の基本オブジェクトです。ほとんどの場合、ioのソースの最初の行はコメント 「SomeObject:= Object clone」です。

つまり、書くときでさえ、「客観的に」ではなく、客観的に書くようです。 例のコード:

 <font color = "#9acd32">階乗</ font> <font color = "#8fbc8f">:= </ font> <font color = "#8b8378">メソッド</ font>(数値、
   <font color = "#8b8378"> if </ font>(<font color = "#9acd32"> number </ font> <font color = "#8fbc8f"> == </ font> 0、
     1
    数値<font color = "#8fbc8f"> * </ font>階乗(number <font color = "#8fbc8f">-</ font> 1)
   )
 )
 factorial(5)<font color = "#8b8378">印刷</ font>


階乗関数を作成するのではなく、ロビーオブジェクトに階乗スロットを作成します。

ロビーは、コンテキストが明示的に別のオブジェクトに切り替わるまで、コンテキストオブジェクトです。



リトルブードゥー



ioのオブジェクトは内省的です。つまり、倒錯した性質だけが望んでいるように内臓を掘ることができます。理解できないオブジェクトがあれば、その中にあるものを常に見ることができます( neonkaクッキー!)。

 <font color = "#00ff00">ロビー</ font> <font color = "#8b8378"> slotNames </ font> <font color = "#8b8378">印刷</ font>


これはすでに別の記事のトピックであるメタプログラミングを開始しましたが、これまでのところ、ドイツの映画には見られないオブジェクトに対してオンザフライで物事を行うことができることのみ言及します。



モジュール性



これは別の記事のトピックかもしれませんが、いずれにせよやり直す必要があります。 もちろん、ioはモジュラー言語です。 さらに、ioのモジュール性は非常にクールな方法で作成されました。import/ include / require_onceはありません。ここではすべてが簡単です。 現在のファイルの字句的概要に含まれていないオブジェクトを使用しようとするとすぐに、インタープリターとともにメモリーにロードされる特定のモジュールZ_Importerがあります。このモジュールは、オブジェクトの名前を持つファイルを探すために分解します。 最初に現在のディレクトリで、次にライブラリディレクトリ(addSearchPathメソッドで指定)で。 最初の記事のクラスMushroom、Lenin、およびManが別々のファイルにあるとします。 男を養うには?

 Mushroom <font color = "#cd5c5c"> // Mushroom.ioからキノコを入手しました
 </ font> Lenin <font color = "#cd5c5c"> // Lenin.ioからVladimirilichを取得しました
 </ font> Man <font color = "#cd5c5c"> // Man.ioから男性を取得しました
 </ font>
 Man eat(マッシュルーム)
マンステートprintln


私の意見では、これは私が今まで見た中で最もZenの輸入業者です(:



まあ、それがすべてです



メッセージについて覚えておくべき主なものであるioオブジェクトモデルについて知っておく必要があるのはこれだけのようですが、これはまったく別の話です(:



参照資料



誰かが、何、どこ、いつ、どのように興味があるのか​​、ioのリファレンスを読むことができます: http : //iolanguage.com/scm/git/checkout/Io/docs/IoReference.html

また、昨日、ioに関するロシア語のircチャンネルに手を出しました:#io-ru @ FreeNode、興味のある人を待っています(:



PSちなみに、ioの専門家の一人(そしてStrokeDBの開発者が追いついています)、 オレガンザ 、マイナスに座って、間違いを犯したか何かを言わなかった場合、彼に私を修正するか、 追加するように頼みたいです。



(私のブログから)



All Articles