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

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

ユーザ用ツール

サイト用ツール


ch_syntax

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
ch_syntax [2020/07/11 04:53]
klab [タイマーによる実行]
ch_syntax [2020/07/11 05:22] (現在)
klab [中置記法]
ライン 107: ライン 107:
 中置記法とメッセージ送信記法のもう1つの違いは、中置記法の中では名前は変数を表す、ということである。これに対し、メッセージ送信記法の中では直接変数を書けるのは「!」の左側だけであり、「!」の右側では名前はメソッド名として扱われる。したがって、パラメータなどで変数を指定したい場合は「(…)」で囲む必要がある(囲んだ中は中置記法にできるため)。たとえば、中置記法の「x+y」をメッセージ送信記法で書くと「x!(y)足す」になるが、この「(y)」は丸かっこの中に(「!」がないため)中置記法が書かれているものとして扱われている。 中置記法とメッセージ送信記法のもう1つの違いは、中置記法の中では名前は変数を表す、ということである。これに対し、メッセージ送信記法の中では直接変数を書けるのは「!」の左側だけであり、「!」の右側では名前はメソッド名として扱われる。したがって、パラメータなどで変数を指定したい場合は「(…)」で囲む必要がある(囲んだ中は中置記法にできるため)。たとえば、中置記法の「x+y」をメッセージ送信記法で書くと「x!(y)足す」になるが、この「(y)」は丸かっこの中に(「!」がないため)中置記法が書かれているものとして扱われている。
  
-中置記法の中で使える演算子としては、**+**(足す)、**-**(引く)、*****(掛ける)、**/**(割る)、**%**(余り)がある(かっこ内はメソッドとして使うための名称)。このほか、比較演算子**==**(eq)、**!=**(ne)、**>**(gt)、**>=**(ge)、**<**(lt)、**<=**(le)もある。+中置記法の中で使える演算子としては、**+**(足す)、**-**(引く)、*****(掛ける)、****(割る)、**%**(余り)がある(かっこ内はメソッドとして使うための名称)。このほか、比較演算子**==**(eq)、**!=**(ne)、****(gt)、**=**(ge)、****(lt)、**=**(le)もある。
  
 また、中置記法の中では関数記法が使える。たとえば、「sqrt(2)」は「2!sqrt」の略であり、そのほか任意のパラメータなしのメソッド「オブジェクト!メソッド」を「メソッド(オブジェクト)」の形で書くことができる。 また、中置記法の中では関数記法が使える。たとえば、「sqrt(2)」は「2!sqrt」の略であり、そのほか任意のパラメータなしのメソッド「オブジェクト!メソッド」を「メソッド(オブジェクト)」の形で書くことができる。
ライン 148: ライン 148:
 「!」の前に何もないときは、そのメソッドを持っているオブジェクトが指定されているものとして扱われる。また、特別な名前「自分」もメソッドを持っているオブジェクトを指定するのに使うことができる。従って上の例は「自分!…」のように書いてもよい。 「!」の前に何もないときは、そのメソッドを持っているオブジェクトが指定されているものとして扱われる。また、特別な名前「自分」もメソッドを持っているオブジェクトを指定するのに使うことができる。従って上の例は「自分!…」のように書いてもよい。
  
-{{:​pasted:​20180103-210342.png?​500}}+{{:​pasted:​20180103-210342.png?​450}}
  
 ブロックは1つの式であり、最後に評価した式の値をブロック全体の値として返す。メソッドから値を返したいときはこれを利用する。上の例では、最後に評価されるのはメソッド「歩く」なので、それが返した値、つまりかめた自身が「曲がって動く」の返す値となる。そこで引き続きかめたに対するメソッド「横の位置?」を呼び出してそのX座標を調べているわけである。 ブロックは1つの式であり、最後に評価した式の値をブロック全体の値として返す。メソッドから値を返したいときはこれを利用する。上の例では、最後に評価されるのはメソッド「歩く」なので、それが返した値、つまりかめた自身が「曲がって動く」の返す値となる。そこで引き続きかめたに対するメソッド「横の位置?」を呼び出してそのX座標を調べているわけである。
ライン 247: ライン 247:
 タイマーは、あらかじめ指定された**間隔**で、指定された**回数**または**時間**だけ、ブロックを繰り返して実行する。標準では、間隔が0.1秒、回数が100回に設定されている。 タイマーは、あらかじめ指定された**間隔**で、指定された**回数**または**時間**だけ、ブロックを繰り返して実行する。標準では、間隔が0.1秒、回数が100回に設定されている。
  
-{{:​pasted:​20180103-210522.png?​350}}+{{:​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.1594410835.txt.gz · 最終更新: 2020/07/11 04:53 by klab