HyperTalk

提供: miniwiki
2018/8/19/ (日) 20:03時点におけるAdmin (トーク | 投稿記録)による版 (1版 をインポートしました)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先:案内検索

HyperTalk(はいぱーとーく)はHyperCardに用いられるプログラミング言語。

概要

インタプリタ方式を採用するスクリプト言語で、その文法は英語に近く、初心者にもなじみやすい。

HyperCard開発チームのダン・ウィンクラーがデザインした。拡張性を考え、XCMD(外部コマンド)とXFCN(外部関数)という機構も用意され、プラグイン的に機能を追加可能である。

HyperCardがオブジェクト指向環境の為、それぞれのスクリプトは、HyperCardのスタック上のオブジェクトであるカードやボタン、フィールドなどのパーツ(オブジェクト)に付随する。

簡単な例

on mouseUp
  Beep
  put sqrt(2+4) into card field "計算結果" 
end mouseUp

この例は、このスクリプトが付加されているオブジェクト(パーツ)の上で、 マウスがクリックされたら、ビープ音を鳴らし、 2と4を加えた結果の平方根を、このオブジェクトが乗っているカードに存在する『計算結果』という名のフィールドに送る。 mouseUpとなっているのは、マウスクリックのチャタリングを防止するために、クリック後のアップを取り出している。

他言語との比較

C言語との比較

ここでは、初心者が初めて学ぶ言語として広く浸透しているC言語を例に比較する。

  • C言語は文章の区切りとしてセミコロンを使い、比較的自由な表記が可能であるが、スクリプト言語であるHyperTalkは改行が文章の区切りとなるため、文章の途中で改行するとエラーになる。例えば「put "Hello, World!" into A」と表記すべきところを「put "Hello,(改行) World!" into A」と表記するとエラーになる。
  • 変数宣言や関数宣言が不要であり、また代入する値(整数、小数、文字列)を意識せずに変数に代入できる。
    • 例えばAという変数に「10」という整数が入っていたとしても、新たに宣言することなく「0.5」という小数や「ten」という文字列を入れることが出来る。
    • ただし、文字(列)が入った変数に整数を加算する…といった動作はエラーとなり動かないため注意が必要である。尚、文字列と文字列、もしくは文字列と数値を繋げる記号は「&」である。
    • また、数値間での型違い(整数、小数、符号付き・無し)が無いため、例えば、「0.5*4」「0.5+1.5」といった小数を元にした計算でも、結果が整数となる物は強制的に整数となり(小数点以下が無くなった状態で)代入される。一方、C言語では最も上位の型に変換され、最終的に代入する変数の型で決定される。このため、例えば「float型 = double型*int型」といった場合は最終的にfloat型に丸められた値が代入される(詳しくは型変換を参照)。
    • 変数の適用範囲もC言語とほぼ同じで、例えばある関数で使われた変数は呼び出した別の関数では適用されない。ただし、グローバル変数はこの限りではない。
  • 変数の代入・取り出しに関しては全て「put」命令を使うことになる。
    • 例えばC言語での「A = B+C」をHyperTalkで書くと「put B+C into A」となり、C言語とは順序が逆になる。
    • また、「put」はinto以下を指定しなければ標準出力(メッセージボックスと呼ばれる小さい文字列表示用のウィンドウ)へ出力するほか、フィールド等へオブジェクトへの代入も可能(詳しくはHyperCardを参照)。
    • ちなみに「=」はHyperTalk上では等号の意味を持ち、代入には使えない(C言語での「==」に相当)。
  • 配列の概念が存在しないが、文節(word)、(line)、ある任意(標準ではカンマ(,)であるがスクリプト内で変更可能)の文字(item)、文字単位(char)での区切りで代入・取り出しが標準で可能である。ただし、日本語に関する「word」の処理に関しては動作がアバウトであるため、カンマで区切って「item」を使い処理することが望ましい。
    • これを使うことによって配列と同じような処理を行える。例えば、次の二つのコードはほぼ同様の処理をしている(便宜上「main()」や「on openstack」を省略する)。

HyperTalk

put "10,20,30,40"&return&"100,200,300,400" into array -- 「&return&」は改行を意味する
put item 2 of line 1 of array + item 2 of line 2 of array into A
answer "A="&A -- 「A=220」とダイアログに表示

C言語

int A,array[][]={{10,20,30,40},{100,200,300,400}};
A = array[0][1] + array[1][1];
printf("A=%d",A);

また、C言語よりも比較的自由に文字列処理が可能である。

put "ABC,DEF,GHI"&return&"GHI,DEF,ABC" into array
put item 2 of line 1 of array & item 2 of line 2 of array into A
answer A -- 「DEFDEF」とダイアログに表示
  • C言語はポインタを使ったメモリの動的割り当てやシフト演算といったハードウェアレベルでのアクセスが可能であるが、(スクリプト言語であることも関係しているが)HyperTalkはそういった処理は標準では不可能である。
    • ただし、サウンド処理や画像処理などOSレベルにアクセスする処理については前述のXCMDやXFCNを使えば可能である。
  • そのほか、繰り返しや条件分岐においてはC言語とほぼ同じ処理が可能である。
    • 例えば、繰り返しに関してはC言語での「while(1){~}」(無限ループ)は「repeat ~ end repeat」、「for(i=1;i<=10;i++){~}」は「repeat with i = 1 to 10 ~ end repeat」という風に、条件分岐は「if(i==10){~}」は「if i=10 then ~ end if」という風に記述すれば同様の処理が可能。