はじめに
日本語プログラミング言語ドリトルでのオブジェクトプログラミングの基本のキについて説明したいと思います。
対象読者
日本語プログラミング言語ドリトルのユーザー、または日本語プログラミング言語に興味のある方
ドリトルのオブジェクトプログラミングの基本のキ
ドリトルはクラスベースではなくプロトタイプベースのオブジェクト指向言語です。プロトタイプベースのオブジェクト指向言語の例としてはJavaScriptがあります。
オブジェクト変数の継承
ドリトルではあらかじめ用意されているオブジェクト変数(のプロパティとメソッド)を継承定義して、ユーザーが定義したオブジェクト変数のプロパティやメソッドを拡張定義していきます。
下記はドリトルのオブジェクト変数「テキストエリア」を継承して「表示エリア」というオブジェクト変数を宣言しているようすです。
表示エリア=テキストエリア!("")作る。
下記のような構文となります。
新しいオブジェクト変数名=継承元オブジェクト変数名!引数 作る。
※引数が変数名の場合は丸かっこ必須となります。丸かっこで囲うとその中で中値記法で演算も定義できます。上記の例は筆者の趣味で、空列のリテラル""にも丸かっこで囲っていますが、リテラルの引数だけの場合は不要で、複数の引数を空白区切りで列挙するだけでOKです。
オブジェクト変数のメソッド引用
オブジェクト変数の継承宣言で使われている継承元オブジェクト変数のメソッド「作る」を引用する際には、継承元オブジェクト変数名に「!」を付加してオブジェクト参照をしていることを明示します。
テキストエリア!("")作る。
オブジェクト変数名!引数 メソッド名。
ルートオブジェクト
ドリトルのオブジェクト変数の中に「ルート」という特殊なオブジェクトがあります。ドリトルはWindowアプリケーションなので、Window上のオブジェクトがオブジェクト変数となっていますが、個々のオブジェクトのメソッドやイベントにロジックを記述するのではなく、大枠の制御構造などをグローバルに記述する場合は「ルート」を使います。
実行する場合はに「ルート」に「!」を付加して引用します。のちに説明するメソッドの定義の場合は「ルート」であることを明示して「:」を付加することは省略可能です。
ルート!追加したメソッド名。
オブジェクト変数へのメソッド追加定義
下記は上記で宣言した「表示エリア」というオブジェクト変数に、「改行してから表示する」というメソッドを追加定義しているようすです。
表示エリア:改行してから表示する=「|s1 s2|
s1=s1+""。
「(s1!長さ? ) ==1」!
なら 「自分!(改行コード+s2+s1+s2) 書く。」
そうでなければ 「自分!(改行コード+s1+s2) 書く。」実行。
」。
オブジェクト変数に新しいメソッドを追加定義する基本構文は以下のとおりです。
オブジェクト変数名:新しいメソッド名=「~略~」。
かぎかっこ「」はブロック文の開始と終了の区切り文字となっています。他の日本語プログラミングユーザーの感覚では、文字列リテラルの引用符となっている場合がありますので発想の切り替えが必要です。JavaScriptの波かっこ { } みたいな位置づけと考えましょう。ただし、句点"。"をもって終端とします。
オブジェクト変数のメソッドの引数
メソッド定義のブロック文の最初の「の次にパイプで挟んで空白で区切って文字が引数の変数名となります。ドリトルは動的型付けシステム言語なので、引数のオブジェクト変数名への型名の指定は基本ありません。
表示エリア:改行してから表示する=「|s1 s2| ~略~」。
オブジェクト変数名:新しいメソッド名=「|引数1 引数2 ・・・| 」。
引数の動的型決定に関連して注意事項です。
s1 s2は暗黙には文字列型オブジェクト変数ですが、文字列型のメソッド「長さ?」を引数宣言した直後では文字列型に解決できませんでしたので(そんなメソッドはないと怒られる)、その直前で""を追加代入することでs1を文字列型に解決させています。
「|s1 s2|
s1=s1+""。
「(s1!長さ? ) ==1」!
テキストエリア型の「書く」の引数として渡す場合はこのような事前解決の追加がなくても文字列型で解決され正常表示されました。
制御構文
条件分岐
下記は上記で宣言した「表示エリア」オブジェクト変数の「改行してから表示する」メソッド内に条件分岐を定義しているようすです。
「(s1!長さ? ) ==1」!
なら 「自分!(s2+s1+s2) 書く。」
そうでなければ 「自分!(s1+s2) 書く。」実行。
下記のような構文となります。
「条件式」!なら 「実行文1」 そうでなければ 「実行文2」 実行。
他のプログラミング言語ですと、条件式の区切りは中かっこ( )が連想されますがドリトルは条件式の「」もブロック文オブジェクトという扱いで一貫していて、オプジェクト変数参照の!を使って結果を取得します。
他のプログラミング言語のelseがない構文は下記のようになります。
「条件式」!なら 「実行文1」実行。
反復
回数指定
下記は「段ボール箱」という整数型の一次元配列を作成し、反復構文の中で繰り返し配列の中身をテキストエリアに表示しているようすです。
段ボール箱=配列!19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 作る。
段ボール箱の数を表示する=「
「|回数|
「(回数) ==1」!
なら 「表示エリア!(回数) " " 改行してから表示する」
そうでなければ 「表示エリア!(回数) " " 表示する」実行。
」!(段ボール箱!要素数?)繰り返す。
」。
基本形は下記のような構文となります。
「実行文1」!(回数指定変数または値)繰り返す。
反復回数を実行文の最初の引数に設定することもできます。ブロック文の中でこのいま何回目の反復回数を変数として使えるようになります。
「|回数に相当する整数型変数|実行文1」!(回数指定変数または値)繰り返す。
条件成立の間
下記はルートオブジェクトに「段ボール箱から最小値の要素番号を線形探索する」というメソッドを追加定義しているようです。
段ボール箱から最小値の要素番号を線形探索する=「|開始要素番号 ; 現在の要素番号 暫定最小値要素番号|
暫定最小値要素番号=開始要素番号。
現在の要素番号=開始要素番号 + 1。
「現在の要素番号 <= (段ボール箱!要素数?)」!の間
「
「(段ボール箱!(暫定最小値要素番号) 読む)>(段ボール箱!(現在の要素番号) 読む)」!
なら 「暫定最小値要素番号=現在の要素番号。」実行。
現在の要素番号=現在の要素番号 + 1。
」実行。
(暫定最小値要素番号)。
」。
下記のヶ所が反復構文に該当します。
「現在の要素番号 <= (段ボール箱!要素数?)」!の間
「
」実行。
基本形は下記のような構文となります。
「条件式」!の間 「実行文1」実行。
オブジェクト変数のメソッドのローカル変数
メソッド定義のブロック文の最初の「の次にパイプで挟んで空白で区切って文字が引数の変数名となりますが、その後にセミコロンで区切った文字がローカル変数名となります。ドリトルは動的型付けシステム言語なので、ローカル変数のオブジェクト変数名への型名の指定も基本ありません。
段ボール箱から最小値の要素番号を線形探索する=「|開始要素番号 ; 現在の要素番号 暫定最小値要素番号|
オブジェクト変数名:新しいメソッド名=「|引数1 引数2 ・・・ ;ローカル変数1 ローカル変数2 ・・・| 」。
オブジェクト変数のメソッドの戻り値
下記のように実行したメソッドの戻り値を取得して変数に代入したいような場合
最小値要素番号=ルート!(現在の要素番号) 段ボール箱から最小値の要素番号を線形探索する。
下記のように定義部分でローカル変数名をかっこ書きして実行ブロック文の末尾に置いたらその変数の値が戻りました。
段ボール箱から最小値の要素番号を線形探索する=「|開始要素番号 ; 現在の要素番号 暫定最小値要素番号|
暫定最小値要素番号=開始要素番号。
現在の要素番号=開始要素番号 + 1。
~略~
(暫定最小値要素番号)。
」。
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。ご紹介した構文を実際に実行している様子はこちらの記事をご参照ください。
ドリトル
ドリトルは、教育目的で開発された日本語プログラミング言語であり、中学校・高校の教科書や副教材などに採用されています。語順はSOV型の日本語語順ですが(一部中置記法もあり)、単語間の分かち書きが必要で(!の直後など空白入れなくても可の場合もあり)あくまで形式言語です。
ドリトルの入手方法
ドリトルバージョン3(Windows版)を下記の公式サイトからダウンロードできます。