More ... | HSP3:ガイドラインマニュアルを補うためのガイドライン(指針)です。 ユーザにより提案・採用されたもので、公式に採用されているものではありません。 文法HSPでの標準命令/標準関数の区別まず、命令/関数を分類するのに、「値を返すか」と「プログラムの状態を変えるか」に着目します。 これを表にすると、次の様に分類できます。
1-2と2-1に関しては、それぞれ命令、関数になるのは明らかです。 また、2-2に関しては、実際このような機能を提供するものは無いと思われます。 これを表に当てはめるとこうなります。
問題は、ここで?になっている部分です。 ここは命令とも関数とも考えられます。 これがHSP3ではどうなっているかは、幾つかのタイプがあります。 まず、返り値が重要でない場合、システム変数を介して返しています。 これはexecやdialogなどが相当します。 返り値とすれば重要だけど、返り値でなくても良いものは、先に引数で指定します。 これはscreenなどが相当します。 最後に、返り値として重要で、返り値でなければならないものは、引数に返します。 これはnewcomなどが相当します。 (結局の所は全て命令。) まとめると、こんな感じです。(上から順番にチェック)
「関数になる(すべき)かどうか」だけに注目すれば、「状態を変えるかどうか」という事になります。 プラグイン・モジュールでの命令/関数の区別プラグイン・モジュール提供者は、なるべくHSP標準の仕様に合わせるのが望ましいですが、「関数では引数の内容を変えない」という程度のルールさえ守ればどちらでもよいでしょう。ただし、同じプラグイン・モジュール内では同じ基準を使いましょう。 以下は標準以外の基準例です。
globalの付け方モジュール内で定義した定数が別モジュールでglobalとして定義されていると、モジュールが上手く動きません。モジュールが使える人なら一時的に書き換えて対応できますが、分からない人にはどうしようもない問題です。また、もっと長い目で見ると、モジュールがバージョンアップするとまた書き換えなければならず、場合によっては再配布も不可能になります。 なので、モジュール開発者の方は、可能な限りglobalは付けないようにしましょう。 暗黙のglobal#defineなどは明示的にglobalを指定しなければglobalになりませんが、以下のプリプロセッサ命令ではglobalを付けなくてもglobalになります。
これらをglobalにしたくない場合は、名前空間の指定を必ず行ってください。 ; 指定例 #module "foo" #deffunc bar@foo return #deffunc baz@ return #global 名前空間モジュール外でも用いる定義にglobalを付けない方が良い理由は前記の通りですが、 globalを付けない場合の対応方法としては2つ考えられます。
どちらでもいいですが、歴史的経緯で後者が使われる事が多いです。 命令#define文の区切りには、 : と%cが使えます。しかし、%cを命令文の区切りに使うと、以下のようなエラーが出る場合があります。 #define maco(%1,%2) mes %1 %c mes %2 if 1 : macro "A","B" : else : macro "C","D" 実行結果
これは、プリプロセッサによって、次のように展開されるためです。 if 1 : mes "A" mes "B" : else : mes "C" "D" 元々、%cは一部のプリプロセス文のために用意されたものなので、特別な理由が無い限りは : を使いましょう。 |