アットウィキロゴ

拡張文法

この項目ではHSPの拡張文法について更に勉強していきます。

1. #define

 置換のみならばC言語と同じように使うことが出来ます。
  1. // defineマクロの例
  2. #define out mes
  3. out "AAAAA"
  4. out "BBBBB"
  5.  

このような単純な文字列の置換の他に、引数付きの置換も行うことが出来ます。ただし、引数は%1,%2,%3,・・・という形で指定します。C言語のように自由に名前をつけることは出来ないので注意が必要です。
  1. // defineマクロの例
  2. #define out(%1, %2) mes (%1) + " = " + (%2)
  3. out "param","AAAAA"
  4. out "param","BBBBB"
  5.  

また、引数にデフォルト値を設定することが出来ます。
  1. // defineマクロの例
  2. #define out(%1="prm", %2="none") mes (%1) + " = " + (%2)
  3. out ,"AAAAA"
  4. out
  5.  

ここまでは関数ではなく命令の置換を行ってきました。今度は、関数の形で置換する方法についてです。こちらのほうがC言語の#defineマクロとよく似ていますが、「ctype」というキーワードを入れいる必要があります。
  1. // defineマクロの例
  2. #define ctype SENKEI(%1) ((%1)*5 + 5)
  3. mes "SENKEI(5) = " + SENKEI(5)
  4.  

最後に定数の設定についてです。定数を#defineマクロで宣言することもできるのですが、定数を宣言するためのマクロが用意されているので、それを紹介しておきます。
  1. // defineマクロの例
  2. #const ALL 50
  3. #const KAZU ALL*100
  4. mes "KAZU = " + KAZU
  5.  

このプログラムは次のように展開されます。
  1. mes "KAZU = " + 5000
  2.  
すなわち、#constマクロで宣言することで予め計算を行ってくれます。#defineよりも#constを進める理由は高速な計算が可能になるからです。


2. ユーザー定義命令

 ユーザー定義命令は#defineマクロと非常によく似ていますが、#defineマクロのように展開は行わず、毎回命令を呼び出します。
  1. // defineマクロの例
  2. #deffunc 命令の名前 変数1の型 変数1の名前, 変数2の型 変数2の名前, …
  3. // 処理の内容
  4. return
  5.  

変数の型は次の中から指定します。
説明
int 整数値
var 変数(配列なし)
array 変数(配列あり)
str 文字列
double 実数値
local ローカル変数

これらの中で、int,var,str,doubleは命令に値を渡すだけなので、命令内で代入をすると実行時にエラーとなってしまいます。それとは異なり、varやarrayは変数そのものを渡します。そのため、命令内で代入することができ、命令の呼び出し元へ値を返すことができます。
  1. // deffuncマクロの引数の型の違い
  2. a = 0: b = 0
  3.  
  4. mes "(a, b) = (" + a + ", " + b + ")"
  5. statement a, b
  6. mes "(a, b) = (" + a + ", " + b + ")"
  7.  
  8. stop
  9.  
  10. #deffunc statement var variable1, int number
  11. variable = 5 // これはできる。
  12. // number = 10 // これはエラーになる。
  13. return
  14.  

型の中で同じようなものが一組あると思います。varとarrayの違いは知っておくべきです。これらの違いは引数を配列として扱うかどうかの差です。varで指定された引数は配列ではないただの変数として扱われ、arrayで指定された引数は配列として扱うことができます。次の例を見てください。
  1. // deffuncマクロの引数の型の違い
  2. a(0) = 0
  3. a(1) = 1
  4. a(2) = 2
  5.  
  6. func1 a(1), a(1)
  7.  
  8. stop
  9.  
  10. #deffunc func1 var variable, array arr
  11. mes "variableと表記 : " + variable
  12. mes "variable(1)と表記 : " // + variable(1) // 実行時にエラーとなる
  13. mes "arrと表記 : " + arr
  14. mes "arr(1)と表記 : " + arr(1)
  15. return
  16.  

この例ではどちらの引数も「a(1)」を引数として与えています。引数の型としてvarを指定すると、a(1)という変数として命令に渡すので、命令内の変数である「variable」を配列として扱うことはできません。しかし、引数の型としてarrayを指定すると、「a(1)」を引数としても、命令には「a」という配列が渡されます。そのため、命令内の変数である「arr」も配列として扱うことができるわけです。


3. ユーザー定義関数

 基本的にはユーザー定義命令と同じです。ただし、一つだけ異なる点があります。それは、値を一つだけ返すことができる点です。ユーザー定義命令はC言語のvoid型の関数とよく似ていますが、ユーザー定義関数はC言語のvoid型以外の関数とよく似ています。
  1. // defineマクロの例
  2. #defcfunc 命令の名前 変数1の型 変数1の名前, 変数2の型 変数2の名前, …
  3. // 処理の内容
  4. return 返り値
  5.  

命令ではなく関数なので、呼び出し方は命令の時とは少し異なります。実際に使ってみると次のようになります。
  1. a = half(4)
  2. mes "" + a
  3. stop
  4.  
  5. #defcfunc half int variable1
  6. return variable1/2
  7.  

だれがこんな関数を使うんだとか言うツッコミは無しでお願いします。もちろん、引数が二つ以上の時の指定の仕方もユーザー定義命令の時と同じですし、変数の型についてもユーザー定義命令の時と同じです。




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