HSPで本格的にプログラムを書きたい人向けのtips

※姉妹記事：[使いやすいけど使いづらいプログラミング言語「HSP」について](http://qiita.com/YSRKEN/items/0c059abfb8685051cb16)

#概要
　タイトル通りです。素の「ＨＳＰスクリプトエディタ」(原文ママ)だけだと**非常に辛いものがある**ので、プログラムを組みやすいように環境を構築していきます。

#エディタ
　**素のエディタは使いづらい(理由はあえて書かない)**ので、真っ当なテキストエディタに乗り換えましょう。「[テキストエディタ おすすめ](https://www.google.co.jp/search?q=%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%2B%E3%81%8A%E3%81%99%E3%81%99%E3%82%81)」とかで適当にググってもいいのですが、ここで重要なのが**書いている途中で即座にコンパイルして実行できるようにする**ということです。
　プログラムを書く際はしょっちゅう実行させて、バグがないか・実装できているかをチェックするものです。それなのに、**毎回標準エディタにコピペして実行していたのでは心が折れます**。というわけで、次のどれかによってサクサク実行できるようにします。

* **HSPに対応した専用エディタを使う**……一応[Le.Antilla](http://www.vector.co.jp/soft/winnt/prog/se493405.html)や[HSPDeveloper](http://hspwinapi.blog.fc2.com/blog-entry-15.html)や[改造版HSP3スクリプトエディタ](http://hsp.moe/#hsed3)などがありますが、個人的にはその次の選択肢がオススメです。
* **テキストエディタのマクロ機能を利用する**……少なくとも、[秀丸エディタ](http://hide.maruo.co.jp/lib/macro/hspcompile-ver110.html)・[サクラエディタ](http://xorbit2infinite.seesaa.net/article/389979613.html)・[EmEditor](http://antibayesian.hateblo.jp/entry/2015/01/11/173335)・[Mery](https://github.com/haijinboys/mery-plugin-hsprun)・[TeraPad](http://antares.cn/hsp/anhspc/)用のマクロ/プラグインはあるようです。これ以外に愛用してるエディタがある場合は次しかないかな……？
* **自前で、実行用のマクロやバッチを組む**……大抵のテキストエディタは、外部ファイルに引数を渡して実行させる機能があります。それを使えば、**ワンキーでexeやvbs等を実行させられる**ので何でもありです。「[HSPをコマンドラインからコンパイルして実行できるソフト](https://www.google.co.jp/search?q=HSP%E3%80%80%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%80%80%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)」なんて幾らでもあるのでその辺を利用すればより簡単に実行できます。

#デバッガ
　標準のデバッガなんて窓から投げ捨てて、[knowbug](http://prograpark.ninja-web.net/CollectField/#knowbug)を導入して下さい。デバッグ作業の効率が全然違います。どれぐらい違うかは次の画像で一目瞭然でしょう。
![デバッガ比較](http://i.imgur.com/aO4wCLt.png)

#プラグイン
　標準で付属するプラグインがなかなかに豊富なので、まずはそちらでなんとかならないかを検討しましょう。例えば、画像をpng等様々な形式で保存したい場合は[HSPCV](http://www.onionsoft.net/hsp/ref/docs/hspcv.txt)、データベース操作を高速で行いたい際は[SQLele](http://www.onionsoft.net/hsp/v34/doclib/SQLele/SQLele.txt)が標準で添付されていて便利です。  
　ただ、[コールバック処理を行ったり](http://chokuto.ifdef.jp/download/index.html#hscallbk)、[多倍長整数演算を行ったり](http://hp.vector.co.jp/authors/VA034288/longint/index.html)、[連想配列を使ったり](http://prograpark.ninja-web.net/CollectField/)する場合など、標準では無いものが欲しい場合は迷わず利用しましょう。ただし、**ライセンスには十分に注意して下さい**。

#書き方
　この辺は個人的な趣味が大きく絡んでくるので強要はしませんが、個人的に心がけているコツなどをば。

* **書く前に設計を十分に考慮する**……手続き型言語でしかもグローバル変数がデフォですので、何も考えず書きまくると後々痛い目に遭います。どこをモジュールにしてどこをサブルーチンにするか、結合度はどうするかなどを事前に書き出すなどして管理しましょう。
* **暗黙の型変換はなるべく使わないようにする**……別に使ってもいいのですが、「自分が理解できる範囲内で」という成約が付きます。式の始めに「0」「0.0」「""」などを置いて加算することで型変換するテクニックは頻繁に用いられますが、「英字と数字混じりの文字列を変換する」場合などは特に注意が必要です。自動拡張も同様で、**なるべくdimやddimやsdimで確保**するようにしましょう。
* **elseの後のifはネストが深くならないようにする**……HSPには「else if(){……}」と書く記法はありません。なので、「else :if(){……}」として代用しましょう。
* **なるべくrepeatではなくforを使う**……一応先に言っておくと、速度面ではrepeatの方がforの8倍以上速いです。ではなぜforを推奨するかと言うと、**repeatからreturnで抜けるとlooplevが減少しませんが、forだとその罠がないから**です。looplevはrepeat文に突入すると増え、loopやbreakで抜けると減少します。そしてlooplevが大きくなりすぎると実行時エラーになってしまうのです。「ループ途中からreturnで抜けるとダメ」というのは甚だ奇妙なものですが、HSPの仕様なら仕方ありませんね。
* **モジュールで定義する関数・命令における引数の末尾には_を付ける**……名称が被ってエラーを出さないための自衛策です。どう考えても理不尽な仕様ですが、HSPの仕様なら仕方ありませんね。
* **複雑なロジックや、速度が求められる箇所はC++等で書く**……身も蓋もありませんが、そもそも[ガッツリ書くのには適さない言語](http://www.onionsoft.net/hsp/v33/doclib/hsp3.htm#MESSAGE)ですので仕方ありませんね。HSP用のDLL作成法は次の投稿などが参考になるかと。

　　[DLLの作り方とHSPでの呼び出し方。](http://hsp.tv/play/pforum.php?mode=pastwch&num=22578)
　　[【他でも動く】C言語/C++ で作った関数をHSPで動かす【DLL】](http://blogs.yahoo.co.jp/kerupani/13607703.html)

#その他
　集合知というのはなかなか強力なものですが(Googleを見ながら)、HSPにも集合知の要素は取り入れられます。**HSPには公式で[質問掲示板](http://hsp.tv/play/pforum.php)がある**(オススメだとは言ってない)のですが、そのログが**HSP標準のヘルプで利用できる形式**で[ダウンロードできます](http://hsp.tv/play/pforum.php?mode=all&num=72336)。インストールフォルダ以下のdoclibフォルダにフォルダごとコピーすれば使えます。何が嬉しいかと言えば、HSP標準のヘルプで「オセロ」などと**抽象的なワードを投げても参考になる投稿が出てくる**ということです。初学者にとってこれは大きな助けになるのではないでしょうか？

#まとめ
　**いろいろ気をつけながら楽しいHSPライフを！**