基本の構文

この項目ではHSPの基本構文を勉強していきます。

1. 何もしないプログラム

 それでは、「F5」キーを押してみてください。何もないウィンドウが生成されましたね。HSPでは0行でもプログラムが実行される仕組みになっています。

ポイント:「F5」キーでプログラムを実行する。



2. Hello World

 続いて次のプログラムを入力してください。
  1. mes "Hello World"
  2.  

有名なプログラムです。このプログラムにで「mes "Hello World"」の部分を「命令(ステートメント)」と言います。C言語で言う関数のようなものだと思ってください。HSPではこのような「命令」をたくさん並べてプログラムを作っていきます。ちなみに、HSPでは大文字小文字の区別はありません。なので、
  1. MES "Hello World"
  2.  

と書いても、結果は同じになります。

ポイント:プログラムの最小単位の一つは命令



3. 命令の実行順と区切り文字

 HSPでは特別な場合を除いて、命令は1行目から順に実行されます。そして、原則1行につき命令は1つまでです。1行につき命令は1つと決まっているので、C言語のような「;(セミコロン)」は必要ありません。
 しかし、1行に2つの命令を書いたほうが見やすい時があります。この時のために「:(コロン)」という区切り文字が用意されています。「:」コロンで区切ることで1行に複数の命令を記述することが出来ます。これには、「マルチステートメント」という名前が一応ついています(覚えなくていい)。
  1. mes "Hello World1" : mes "Hello World2"
  2.  

ポイント:原則は1行に1命令。「:」で複数の命令を記述可能



4. 大事な大事なコメント文

 HSPにおけるコメントは3種類です。
  1. /* これはコメント */
  2. // これもコメント
  3. ; これもコメント
  4.  

というように、3種類のコメントが用意されています。コメントが明日の運命を分けます。必ず書くようにしましょう。

ポイント:昨日のコードは他人のコード。コメントは書くようにしよう!



5. インデントの約束

 HSPでは暗黙のインデントルールが存在するようです。これを守っておけば見やすいコードになります。また、インデントは「Tab」です。
  1. // コメントのインデント位置は割と自由
  2. mes "hello" // 地のところにある命令はインデントを一つ下げる。
  3.  
  4. // 後で出てくるが、くりかえし命令の内側はインデントを一つ下げる。
  5. repeat
  6. mes "くりかえし"
  7. loop
  8.  

というようなC言語にも存在するようなインデントのルールが存在します。自分にとっても他人にとっても見やすくなるものなので、適切なインデントを心がけましょう。



6. printfのようなもの

 それではmes命令について説明します。「mes」という命令名の後に文字列を続けます。この命令は文字列を表示して、1行分改行するという命令です。正しい説明ではありませんが、今はこういう理解で良いです。文字列の中では次のような特殊な意味を持つキャラクタを使えます。C言語でいうエスケープシーケンスと呼ばれるものです。
\n 改行をする。
\t TABコードを表す。
\r リターンコード(0x0d)を表す。
\" 「"(ダブルクオート)」を表す。
\\ 「\(バックスラッシュ)」を表す。
mes命令はC言語でいうprintf()関数のようなものです。ただし、フォーマット指定子のようなものは存在しません。変数の表示方法は後ほど説明します。

ポイント:mes命令は文字列を表示して、改行をする命令



7. 数字と文字列

 HSPでは「"(ダブルクオーテーション)」で囲まれたものを文字列といいます。また、普通に書かれた数字は整数や実数として扱われます。HSPでは「数字と数字」の演算だけではなく、「文字列と数字」や「文字列と文字列」の演算を行うことが出来ます。
  1. mes 127 + 256
  2. mes "str" + 127
  3. mes "str1" + "str2"
  4.  
実行するとどうなりましたか?このように、HSPでは「数字と数字」や「文字列と数字」、「文字列と文字列」の演算が定義されています。なお、mes命令は整数や実数を引数として受け取る事ができるため、今回のようなプログラムでもエラーは発生しません。


 それでは問題です。次の実行結果はどうなるでしょうか。
  1. mes "str : " + 127 + 256
  2.  


実行結果は次のようになったはずです。
  1. str : 127256
  2.  

「str : 383」と表示されると思った人もいるのでは無いでしょうか。なぜ「str : 127256」という結果になったのかを理解するためのキーワードは演算の型です。HSPの演算規則とC言語の演算規則はほとんど同じで、優先順位の高いところから計算されます。つまり、今回の場合は、まず、「"str : " + 127」が計算されて、文字列の「"str : 127"」となります。この時点で「127」は整数ではなくなり文字列となります。その後、文字列と整数の加算「"str : 127" + 256」が計算されて、「str : 127256」が表示されるわけです。



では、次の実行結果はどうなるでしょうか。
  1. mes 127 + 256 + " : str"
  2.  

今回は整数型どうしの計算が先に行われるので、
  1. 383 : str
  2.  

となるのはわかりますね?


ポイント:文字列の加算ができる。このとき、演算の型に注意



8. 変数と型

 変数についての説明はもういいと思います。ここでは、HSPの変数の特徴について説明します。
 HSPにはC言語のような変数宣言は存在しません。以下のようにいきなり名前を書くことで変数となります。
  1. a = 25
  2. b = 30
  3.  
  4. mes "a = " + a
  5. mes "b = " + b
  6.  

変数はアルファベットまたは日本語で始まる59文字(半角)以下の文字列となっています。つまり、日本語変数名が許されています。
いいですか、みなさん。悪いことは言わん。変数名に日本語は使うな。
全角入力が許されているのは変数名とコメントのみです。ホワイトスペースを間違って入力しないためにも、全角は使わないほうがいいです。

 次に型について話していこうと思います。HSPでは「#center(){数値型、文字列型、実数型}」という3つのが用意されています。型は最後に代入したものによって決まります。なので、次のようにすることで、数値型、文字列型、実数型それぞれの変数を作成することが出来ます。
  1. a = 25 // 数値型の変数
  2. b = "strings" // 文字列型の変数
  3. c = 25.5 // 実数型の変数
  4.  

最後の代入時に型が決まります。したがって、次のような構文でも実行可能です。型変換は意図せずとも実行されるので、注意が必要です。
  1. string = "25"
  2. number = 10
  3.  
  4. number = string // この時、numberの型は文字列型に変更されています。
  5.  

では、変数numberの型を数値型で保持したまま25という数字を代入するにはどうすれば良いのでしょうか。こんな時に使えるのが関数intやstrです。
  1. a = int(a) // 変数aを数値型にする
  2. b = str(b) // 変数bを文字列型にする
  3. c = double(c) // 変数cを実数型にする
  4.  

このような関数を使うことで、型を変更することが出来ます。


ポイント:変数の型は「数値型、文字列型、実数型」の3つで、最後に代入したものがその変数の型になる。



9. 式

 HSPでは、データや演算子で構成されたものを「」としてしています。この「式」は演算を行ってから代入されたり、命令に渡されたりします。要は、C言語と同じです。ただし、データや演算子にはC言語と異なるものもあるので注意が必要です。

HSPでデータとして記述できるもの一覧
データ 種類
-2147483648~2147483647 10進整数(32ビット)
-???.???~???.??? 10進実数(64ビット倍精度)
$0~$FFFFFFFF, 0x0~0xffffffff 16進整数
%0~%111111...,0b0~0b111111... 2進整数
'A' 文字コード(8ビット整数値)
"文字列" 文字列
変数 値を保持するキーワード
関数 値を変換するキーワード

ポイント:変数の型は「数値型、文字列型、実数型」の3つで、最後に代入したものがその変数の型になる。



10. ミスをしない変数の使い方

 前回、HSPでは変数の宣言が必要ないことを説明しました。この特徴は一見とても楽なように見えるのですが、とても怖い問題をはらんでいます。次のプログラムを見てください。
  1. value = 20
  2.  
  3. // なんだかんだいろんな処理
  4.  
  5. mes "value = " + valuw
  6.  

というように、表示部分で「変数のvalueという変数を打ち間違えた!」とします。このとき表示される数字は何でしょうか。おそらく、0が表示されたんじゃないでしょうか。HSPでは未初期化の変数を使用しても、警告は一応出てるのですが非常にわかりにくい所に出ます。はっきり言って、面倒くさい仕様です。また、次のプログラムを見てください。
  1. x = 20 // 初期値
  2.  
  3. // なんだかんだいろんな処理
  4.  
  5. // 値を保存したくなって、初期値と同じ名前の変数を作ってしまった!
  6. x = 25 + 30
  7.  
  8. // なんだかんだいろんな処理
  9.  
  10. // 初期値の5倍を表示
  11. mes "" + (5*x)
  12.  

というように、「同じ名前の変数を違う用途で使ってしまい、目的の動作が出来ない!」なんてことも良くあります。このようなミスを無くすためにはしっかりと注意を払うしか方法がないのですが、所詮、人間はミスをする生き物です。そこで、使用する変数はプログラムの冒頭で初期化をして意識して使用するということをオススメします。よって、プログラム全体は次のような形になるはずです。一部未解説の内容もありますが、とりあえず、プログラムの冒頭で変数の初期化をするクセをつけると良いと思います。こうしておくと、間違ったな名前の変数が生成されているときに見つけやすくなりますし、名前の重複もこの段階で気づくことが出来ます。
  1. #include "iroiro.as"
  2.  
  3.  
  4. /*****************************
  5. * 変数の初期化
  6. *****************************/
  7. num = 0
  8. string = "ここは"
  9. fudou = 5.5
  10.  
  11.  
  12.  
  13. /*****************************
  14. * メインの処理
  15. *****************************/
  16. *main
  17.  
  18. // 命令群
  19. pos num, 50
  20. mes string + num
  21. num += 40
  22.  
  23. await 33
  24. if(num > 640){
  25. goto *owari
  26. }
  27.  
  28. goto *main
  29.  
  30. stop // 安全マージンのstop
  31. /*****************************
  32. * 以下、ラベル郡
  33. *****************************/
  34. *label1
  35. // なにかの処理
  36.  
  37. return
  38.  
  39. *owari
  40. end
  41.  


11. scanfはありません

 さて、ここまでたまーに比較対象となっていたC言語ですが、HSPにはC言語のようなscanf関数はありません。その代わりにstickey命令やgetkey命令が用意されています。この命令は現在押されているボタンを返してくれる命令です。使い方は、命令リファレンスを読んでください。


12. 命令と関数

 最後は命令と関数の違いについてです。違いと言いながら、実は根本的な違いはありません。パラメータを受け取って、一定の手続きをするものです。ただし、使用目的は異なります。
   ・命令 = パラメーターをもとに動作する機能を提供するもの
   ・関数 = パラメーターを一定の法則で加工して値を返すもの
すなわち、命令と関数の大きな違いは返り値があるかです。HSPはすべて関数で構成可能ですが、これらの使い分けは行うべきだと言われています。


それでは次回に続きます。
最終更新:2016年04月05日 13:46