ゆとりーなの日記

日記的な事を書いて行くと思はれる

HSP基礎文法最速マスター

基礎文法最速マスターシリーズに便乗です。HSPはまだないと聞いたんです。
1.Hello World
HSPでは何も書かなくてもウィンドウが生成されます。以下のコードだけで文字列が出力できます。

mes "Hello World"

2.コメント
単一行コメント

mes "Hello World" ; これはコメント
mes "The World" // これもコメント

ブロックコメント

/*
これも
 コメント
  なんです
*/

3.変数
HSPには型がありません。基本的に全てがグローバル変数です。

a = 0     ; 変数aに0を代入する
b = 0.0   ; 変数bに0.0を代入する
c = "abc" ; 変数cに文字列を代入する
a = "cde" ; 整数を入れた変数に文字列を代入できる

4.ラベル
goto *ラベル名、gosub *ラベル名で特定のラベルにジャンプできます。HSPでは基本的にこれでサブルーチンを実現します。gotoとgosubではジャンプ後の挙動が違います。
ラベル宣言

*helloworld ; ラベル名

gotoはC言語等のものと挙動に大きな違いはありません。

goto *helloworld ; *helloworldに飛ぶ
mes "The World" ; ここは実行されない

*helloworld
mes "Hello World" ; ウィンドウにHello Worldと表示される

gosubを使うと、return文に出会ったときに、呼び出し元のgosubの次の文に制御が戻ってきます。

gosub *helloworld ; *helloworldに飛ぶ
mes "The World" ; ウィンドウにThe Worldと表示される

*helloworld
mes "Hello World" ; ウィンドウにHello Worldと表示される
return ; 呼び出し元のgosub文の次の行に飛ぶ

returnを使う場合は、サブルーチンジャンプ(gosub等)以外で実行されることがあってはいけません。
5.基本演算
四則演算

num = 1 + 1 ; num = 2
num = 1 - 1 ; num = 0
num = 1 * 1 ; num = 1
num = 1 / 1 ; num = 1

余りの求め方

num = 3 \ 2 ; num = 1

インクリメント類

i++
i--
i += 1
i -= 1
i *= 1
i /= 1

6.配列
配列は次のように宣言します。

dim a, 5      ; 整数を格納する要素数5の1次元配列
dim b, 5, 5   ; 整数を格納する5*5の2次元配列
ddim c, 5     ; 小数を格納する要素数5の1次元配列
sdim d, 5, 10 ; 5文字までの文字列を格納する要素数10の1次元配列

配列は全て0初期化されます。dimに小数、ddimに整数を格納することはできません。
配列アクセスです。

; 要素の代入
a(0)    = 1 
b(0, 0) = 1 ; C言語等とは添え字の順番が逆なので注意
; 要素の参照
a(0)
b(0, 0)

7.制御文
if文

if 条件 : 実行内容
if 条件 {
  実行内容
}

比較演算子

a = b         ; aはbと等しい
a ! b         ; aとbは等しくない
a < b         ; aはbより小さい
a > b         ; aはbより大きい
a <= b        ; aはb以下
a >= b        ; aはb以上

条件論理演算子

条件1 & 条件2 ; 条件1かつ条件2
条件1 | 条件2 ; 条件1または条件2

if 〜 else文

if 条件 : 実行内容 : else : 実行内容
if 条件 {
  実行内容 
} else {
  実行内容
}

repeat文

repeat 10
  ; 10回実行される
  mes cnt ; ループ回数が表示される
loop

cntはループ回数を記録するシステム変数です。repeatの後にループ回数を書かないと無限ループになります。
continue, break文

repeat 10
  if cnt = 5 : continue ; 6回目にrepeatまで戻る
  if cnt = 7 : break ; 8回目でループを抜ける
loop

while文

i = 0
while i < 5
  i++
wend ; iが5以下の間だけ繰り返される

do文

i = 0
do
  i++
until i > 5 ; iが5より大きくなるまで繰り返される

for文

for 変数,初期値,終値,増分
; 変数が初期値〜終値の間繰り返される
next

HSPのループ文全般に言えることですが、ループ数がかなり多くなる、あるいは無限ループの場合、wait、await命令をループの中に入れてやる必要があります。
switch文

switch 比較元
case 0 ; 比較元が0だった場合
  ; 処理
  swbreak ; switchから抜ける
case 1 ; 比較元が0だった場合
  ; 処理
defaukt ; 比較元がcaseに当てはまらない場合
  ; 処理
  swbreak
swend ; switch終了

8.ファイル入出力
読み込み

; バイナリファイル
bload "ファイル名",sdimで確保した変数,読み込みサイズ,オフセット
; テキストファイル
notesel バッファを割り当てた変数名
noteload "ファイル名"

書き込み

; バイナリファイル
bsave "ファイル名",sdimで確保した変数,書き込みサイズ,オフセット
; テキストファイル
notesel バッファを割り当てた変数名
notesave "ファイル名"

知っておいた方がよい文法
命令文
HSPでは、命令名 引数1,引数2・・・という形式のものを命令文と言います。mes等がそれです。命令文は以下の様に作ることが出来ます。

#deffunc 命令名 型名 引数名, 型名 引数名, ...
; 処理
return

型名としては、int(整数)、var(変数)、array(配列変数)、str(文字列)、double(小数)、label(ラベル)、local(ローカル変数)があります。命令文は、命令文呼び出し以外で実行されることがあってはいけません。
関数
HSPでは、関数名(引数1,引数2・・・)という形式のものを関数と言います。sin等がそれです。関数は以下の様に作ることが出来ます。

#defcfunc 関数名 型名 引数名, 型名 引数名, ...
; 処理
return 返り値

関数は、関数呼び出し以外で実行されることがあってはいけません。
モジュール
モジュール空間は独立しており、グローバル空間(モジュール外の部分)と変数名、ラベル名が衝突することはなく、スクリプトの実行に影響を与えません。

; グローバル空間
#module モジュール名,モジュール変数名1,...
; モジュール空間
#grobal
; グローバル空間

おわりに
勢いに乗って同じ日に二つも記事を書いてしまいました。HSPやらなくなってから大分経つのでどこか間違ってたり、仕様変更を知らなかったりすることもあるかもです。間違い等あったらお気軽にコメント下さい。