プログラミング言語「ドリトル」

大阪電気通信大学 兼宗研究室

ユーザ用ツール

サイト用ツール


ch_syntax

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
最新リビジョン 両方とも次のリビジョン
ch_syntax [2020/07/11 04:48]
klab [オブジェクト、プロパティ、変数]
ch_syntax [2020/07/11 05:16]
klab [ブロックとメソッド]
ライン 13: ライン 13:
   * コンピュータは単なる命令を実行する装置だから、その命令を取り替えることによって、どのような作業でもこなすようにさせられる。   * コンピュータは単なる命令を実行する装置だから、その命令を取り替えることによって、どのような作業でもこなすようにさせられる。
  
-{{:​pasted:​20180103-210054.png?​400}}+{{:​pasted:​20180103-210054.png?​350}}
  
 そして、プログラミングとは「プログラムを作ること」であり、上の説明の延長でいえば、コンピュータに「自分がさせたいこと」を実行させるように、命令を並べて行く作業だ、ということになる。 そして、プログラミングとは「プログラムを作ること」であり、上の説明の延長でいえば、コンピュータに「自分がさせたいこと」を実行させるように、命令を並べて行く作業だ、ということになる。
ライン 72: ライン 72:
 メッセージ送信によりオブジェクトのメソッドを呼び出すとき、必要に応じて追加の情報を渡すことができる。これをメソッド呼び出しの**パラメータ**と呼ぶ。ドリトルでは、パラメータはメソッド名の**前に**書くことになっている。 メッセージ送信によりオブジェクトのメソッドを呼び出すとき、必要に応じて追加の情報を渡すことができる。これをメソッド呼び出しの**パラメータ**と呼ぶ。ドリトルでは、パラメータはメソッド名の**前に**書くことになっている。
  
-{{:​pasted:​20180103-210210.png}}+{{:​pasted:​20180103-210210.png?400}}
  
 たとえば、ボタンのメソッド「作る」には、パラメータとしてボタンに表示するラベルの**文字列**を渡すことができる。先のプログラムをそのように直してみる。 たとえば、ボタンのメソッド「作る」には、パラメータとしてボタンに表示するラベルの**文字列**を渡すことができる。先のプログラムをそのように直してみる。
ライン 90: ライン 90:
 上の例のように、メソッドのパラメータは複数個指定してもよい。では、並んでいるものがメソッドの名前なのかパラメータなのかはどうやって分かるのだろうか?​ 実は、「!」の右側ではすべての名前はメソッド名として扱われる。「"​ "​」で囲まれた文字列や、「100」などの数値はメソッド名ではないのでパラメータになる。変数名を指定したいときは、変数名を「()」で囲んで「(x)」などのように指定する(後の節で詳しく説明する)。 上の例のように、メソッドのパラメータは複数個指定してもよい。では、並んでいるものがメソッドの名前なのかパラメータなのかはどうやって分かるのだろうか?​ 実は、「!」の右側ではすべての名前はメソッド名として扱われる。「"​ "​」で囲まれた文字列や、「100」などの数値はメソッド名ではないのでパラメータになる。変数名を指定したいときは、変数名を「()」で囲んで「(x)」などのように指定する(後の節で詳しく説明する)。
  
-{{:​pasted:​20180103-210229.png}}+{{:​pasted:​20180103-210229.png?400}}
  
 メッセージのカスケードがある場合、変数に格納される値(メッセージ送信式全体の値)は、一番最後のメソッドが返した値になる。上のプログラムの場合、メソッド「位置」はボタンの位置を変更した後、そのボタンオブジェクト自体を返すので、変数「ボタン1」に格納される値は先のプログラムと同じである。 メッセージのカスケードがある場合、変数に格納される値(メッセージ送信式全体の値)は、一番最後のメソッドが返した値になる。上のプログラムの場合、メソッド「位置」はボタンの位置を変更した後、そのボタンオブジェクト自体を返すので、変数「ボタン1」に格納される値は先のプログラムと同じである。
ライン 103: ライン 103:
 ドリトルでは1つの式は全体としてメッセージ送信記法であるか、全体として中置記法であるかのどちらかであるが、「(…)」で囲まれた中は外側とは別にメッセージ送信記法か中置記法かを選ぶことができる。メッセージ送信記法か中置記法かは、「!」の有無で判断できる。 ドリトルでは1つの式は全体としてメッセージ送信記法であるか、全体として中置記法であるかのどちらかであるが、「(…)」で囲まれた中は外側とは別にメッセージ送信記法か中置記法かを選ぶことができる。メッセージ送信記法か中置記法かは、「!」の有無で判断できる。
  
-{{:​pasted:​20180103-210245.png}}+{{:​pasted:​20180103-210245.png?400}}
  
 中置記法とメッセージ送信記法のもう1つの違いは、中置記法の中では名前は変数を表す、ということである。これに対し、メッセージ送信記法の中では直接変数を書けるのは「!」の左側だけであり、「!」の右側では名前はメソッド名として扱われる。したがって、パラメータなどで変数を指定したい場合は「(…)」で囲む必要がある(囲んだ中は中置記法にできるため)。たとえば、中置記法の「x+y」をメッセージ送信記法で書くと「x!(y)足す」になるが、この「(y)」は丸かっこの中に(「!」がないため)中置記法が書かれているものとして扱われている。 中置記法とメッセージ送信記法のもう1つの違いは、中置記法の中では名前は変数を表す、ということである。これに対し、メッセージ送信記法の中では直接変数を書けるのは「!」の左側だけであり、「!」の右側では名前はメソッド名として扱われる。したがって、パラメータなどで変数を指定したい場合は「(…)」で囲む必要がある(囲んだ中は中置記法にできるため)。たとえば、中置記法の「x+y」をメッセージ送信記法で書くと「x!(y)足す」になるが、この「(y)」は丸かっこの中に(「!」がないため)中置記法が書かれているものとして扱われている。
ライン 148: ライン 148:
 「!」の前に何もないときは、そのメソッドを持っているオブジェクトが指定されているものとして扱われる。また、特別な名前「自分」もメソッドを持っているオブジェクトを指定するのに使うことができる。従って上の例は「自分!…」のように書いてもよい。 「!」の前に何もないときは、そのメソッドを持っているオブジェクトが指定されているものとして扱われる。また、特別な名前「自分」もメソッドを持っているオブジェクトを指定するのに使うことができる。従って上の例は「自分!…」のように書いてもよい。
  
-{{:​pasted:​20180103-210342.png}}+{{:​pasted:​20180103-210342.png?450}}
  
 ブロックは1つの式であり、最後に評価した式の値をブロック全体の値として返す。メソッドから値を返したいときはこれを利用する。上の例では、最後に評価されるのはメソッド「歩く」なので、それが返した値、つまりかめた自身が「曲がって動く」の返す値となる。そこで引き続きかめたに対するメソッド「横の位置?」を呼び出してそのX座標を調べているわけである。 ブロックは1つの式であり、最後に評価した式の値をブロック全体の値として返す。メソッドから値を返したいときはこれを利用する。上の例では、最後に評価されるのはメソッド「歩く」なので、それが返した値、つまりかめた自身が「曲がって動く」の返す値となる。そこで引き続きかめたに対するメソッド「横の位置?」を呼び出してそのX座標を調べているわけである。
ライン 163: ライン 163:
 </​code>​ </​code>​
  
-{{:​pasted:​20180103-210401.png}}+{{:​pasted:​20180103-210401.png?250}}
  
 次のプログラムを実行すると、初期値が0の変数「a」に1を加える処理を10回行い、結果として画面に10が表示される。 次のプログラムを実行すると、初期値が0の変数「a」に1を加える処理を10回行い、結果として画面に10が表示される。
ライン 192: ライン 192:
 </​code>​ </​code>​
  
-{{:​pasted:​20180103-210421.png}}+{{:​pasted:​20180103-210421.png?200}}
  
 たとえば、100以上の値を持つ最初のフィボナッチ数を表示させるプログラムは次のようになる。 たとえば、100以上の値を持つ最初のフィボナッチ数を表示させるプログラムは次のようになる。
ライン 213: ライン 213:
 いずれも、1番目のブロックを実行した結果が真であれば2番目のブロックが実行される。さらに下の形では、2番目のブロックが実行されなかった場合は3番目のブロックが実行される。メソッド「なら」や「そうでなければ」はこれらの制御を適宜行うためのオブジェクトを返す。 いずれも、1番目のブロックを実行した結果が真であれば2番目のブロックが実行される。さらに下の形では、2番目のブロックが実行されなかった場合は3番目のブロックが実行される。メソッド「なら」や「そうでなければ」はこれらの制御を適宜行うためのオブジェクトを返す。
  
-{{:​pasted:​20180103-210442.png}}+{{:​pasted:​20180103-210442.png?550}}
  
 次のプログラムを実行すると、最初に1から10までの乱数を発生し、変数「数」に入れる。続いて、「数」が5より大きいかを判定し、真のときは「なら」に続くブロックを実行し、偽のときは「そうでなければ」に続くブロックを実行する。結果として、実行するたびに、画面に「大きい」と「小さい」がランダムに表示される。 次のプログラムを実行すると、最初に1から10までの乱数を発生し、変数「数」に入れる。続いて、「数」が5より大きいかを判定し、真のときは「なら」に続くブロックを実行し、偽のときは「そうでなければ」に続くブロックを実行する。結果として、実行するたびに、画面に「大きい」と「小さい」がランダムに表示される。
ライン 237: ライン 237:
 </​code>​ </​code>​
  
-{{:​pasted:​20180103-210502.png}}+{{:​pasted:​20180103-210502.png?300}}
  
  
ライン 247: ライン 247:
 タイマーは、あらかじめ指定された**間隔**で、指定された**回数**または**時間**だけ、ブロックを繰り返して実行する。標準では、間隔が0.1秒、回数が100回に設定されている。 タイマーは、あらかじめ指定された**間隔**で、指定された**回数**または**時間**だけ、ブロックを繰り返して実行する。標準では、間隔が0.1秒、回数が100回に設定されている。
  
-{{:​pasted:​20180103-210522.png}}+{{:​pasted:​20180103-210522.png?300}}
  
 ブロックを指定してタイマーのメソッド**実行**を呼び出すと、タイマーはパラメータとして受け取ったブロックを設定された時間間隔で繰り返し実行する。最初の実行は、指定された間隔だけ待った後に行われる。 ブロックを指定してタイマーのメソッド**実行**を呼び出すと、タイマーはパラメータとして受け取ったブロックを設定された時間間隔で繰り返し実行する。最初の実行は、指定された間隔だけ待った後に行われる。
ライン 345: ライン 345:
 </​code>​ </​code>​
  
-{{:​pasted:​20180103-210551.png}}+{{:​pasted:​20180103-210551.png?150}}
  
 配列に入っている要素の数は、**要素数?**で調べることができる。次のプログラムでは、配列に3個の数値を入れた後で、要素数を画面に表示している。画面には3が表示される。 配列に入っている要素の数は、**要素数?**で調べることができる。次のプログラムでは、配列に3個の数値を入れた後で、要素数を画面に表示している。画面には3が表示される。
ライン 357: ライン 357:
 **書く**を使うと、配列の末尾に新しい要素を追加することができる(要素数は1多くなる)。また、**上書き**を使うと、配列の指定位置の要素を書き換えることができる(要素数は変わらない)。**消す**を使うとオブジェクトを指定して、**位置で消す**を使うと要素の位置を指定して、要素を削除することができる。 **書く**を使うと、配列の末尾に新しい要素を追加することができる(要素数は1多くなる)。また、**上書き**を使うと、配列の指定位置の要素を書き換えることができる(要素数は変わらない)。**消す**を使うとオブジェクトを指定して、**位置で消す**を使うと要素の位置を指定して、要素を削除することができる。
  
-{{:​pasted:​20180103-210606.png}}+{{:​pasted:​20180103-210606.png?250}}
  
 次のプログラムでは、3つの要素が格納された配列の末尾に要素を追加し、3番目の要素を上書きした後、2番目の要素を削除し、要素数を画面に表示している。画面には3が表示される。 次のプログラムでは、3つの要素が格納された配列の末尾に要素を追加し、3番目の要素を上書きした後、2番目の要素を削除し、要素数を画面に表示している。画面には3が表示される。
ライン 385: ライン 385:
 </​code>​ </​code>​
  
-{{:​pasted:​20180103-210625.png}}+{{:​pasted:​20180103-210625.png?450}}
  
  
ライン 402: ライン 402:
 </​code>​ </​code>​
  
-{{:​pasted:​20180103-210642.png}}+{{:​pasted:​20180103-210642.png?400}}
  
 子のオブジェクトは親のオブジェクトが持っていたプロパティ(値やメソッド定義)をすべてそのまま引き継ぎ、親と同じように扱うことができる。この仕組みを利用して、タートル、ボタン、配列など、さまざまな標準オブジェクトをプロトタイプとして持つオブジェクトを必要なだけ作って利用できるわけである。 子のオブジェクトは親のオブジェクトが持っていたプロパティ(値やメソッド定義)をすべてそのまま引き継ぎ、親と同じように扱うことができる。この仕組みを利用して、タートル、ボタン、配列など、さまざまな標準オブジェクトをプロトタイプとして持つオブジェクトを必要なだけ作って利用できるわけである。
ライン 418: ライン 418:
 </​code>​ </​code>​
  
-{{:​pasted:​20180103-210705.png}}+{{:​pasted:​20180103-210705.png?350}}
  
 ただし、上で説明したように、子のオブジェクトに同じ名前のプロパティが見つかった場合はそちらが使われるので、親の同名のプロパティは参照されなくなる。たとえば、次の場合はObjBのプロパティが参照されるので、「180」が表示される。 ただし、上で説明したように、子のオブジェクトに同じ名前のプロパティが見つかった場合はそちらが使われるので、親の同名のプロパティは参照されなくなる。たとえば、次の場合はObjBのプロパティが参照されるので、「180」が表示される。
ライン 448: ライン 448:
  
 ###  インスタンス変数 ###  インスタンス変数
-**インスタンス変数**とは、個々のオブジェクトに付随する情報を保持するための変数のことをいう。ドリトルでは、インスタンス変数は個々のオブジェクトのプロパティに他ならない。ブロックがオブジェクトのプロパティとして格納されていて、メソッドとして呼び出された場合、そのブロックの中の変数で、「{\tt |…|}の中に書かれているパラメータやローカル変数以外のものは、インスタンス変数を意味している。たとえば次の例では、{\tt ObjB:x}が21増やされて221になり、それが表示される。+**インスタンス変数**とは、個々のオブジェクトに付随する情報を保持するための変数のことをいう。ドリトルでは、インスタンス変数は個々のオブジェクトのプロパティに他ならない。ブロックがオブジェクトのプロパティとして格納されていて、メソッドとして呼び出された場合、そのブロックの中の変数で、「|…|の中に書かれているパラメータやローカル変数以外のものは、インスタンス変数を意味している。たとえば次の例では、ObjB:​xが21増やされて221になり、それが表示される。
 <​code>​ <​code>​
  ​ObjB=ボタン!作る。  ​ObjB=ボタン!作る。
ライン 484: ライン 484:
  
 ここまでの説明をまとめると、あるブロックの中に現れる名前が何を表すかは、次のようにして決められている。 ここまでの説明をまとめると、あるブロックの中に現れる名前が何を表すかは、次のようにして決められている。
-  - そのブロック冒頭の{\tt |…|}で定義されているものはローカル変数である。+  - そのブロック冒頭の |…| で定義されているものはローカル変数である。
   - そのブロックが直接メソッドとして実行されているなら、それ以外の名前はすべてインスタンス変数である(ただし、参照時は親オブジェクトのプロパティを参照していることもある)。   - そのブロックが直接メソッドとして実行されているなら、それ以外の名前はすべてインスタンス変数である(ただし、参照時は親オブジェクトのプロパティを参照していることもある)。
   - そうでないなら、そのブロックを囲む外側において、同じ規則で名前の使われ方を探索するため1に戻る。   - そうでないなら、そのブロックを囲む外側において、同じ規則で名前の使われ方を探索するため1に戻る。
ライン 590: ライン 590:
  
 ###  コメント ###  コメント
-「//​」から行末までは**注釈**(**コメント**)と解釈され、プログラムの一部として扱われない。人が読むためのメモや、一時的にプログラムの一部を実行したくないときのコメントアウトなどに使うことができる。+「/ /​」から行末までは**注釈**(**コメント**)と解釈され、プログラムの一部として扱われない。人が読むためのメモや、一時的にプログラムの一部を実行したくないときのコメントアウトなどに使うことができる。
  
 たとえば、次の例で、1行目はプログラム全体の注釈、2行目はその処理の注釈、3行目は実行されないように一時的にプログラムの一部をコメントアウトしている。 たとえば、次の例で、1行目はプログラム全体の注釈、2行目はその処理の注釈、3行目は実行されないように一時的にプログラムの一部をコメントアウトしている。
ライン 599: ライン 599:
  // かめきち=タートル!作る。  // かめきち=タートル!作る。
 </​code>​ </​code>​
 +
  
ch_syntax.txt · 最終更新: 2020/07/11 05:22 by klab