HSP3の要望の内、変数の型に関する要望はこちらへ
大数(Bignum)
任意精度有理数型があると個人的にはうれしい。でも需要はなさそう。
- こういったものは、新しい型として拡張プラグインで実装するのがよさそうです。
標準型の充実
8ビット整数(byte)
16ビット整数(word)
符号なし32ビット整数(unsigned int)
64ビット整数 (__int64)
etc...
実質現在のHSPにはchar*(?)とintとdouble型しかサポートされていませんがchar,shortやfloatも標準サポートして欲しいですね。HSPの文字列型は内部で自動的に処理されているようなので少し特殊なのでchar*とも違うようですが・・・。
- 用途は何でしょう?ただメモリサイズだけの問題なら、今のご時世大したメリットじゃないと思います。unsigned型やbool型なんかだと標準にあってもいいかなと思いますけど。
- データの処理用です。元々構造体の所に書いたのはそういう意味だったのですが・・・。(構造体の中の次のメンバとのサイズ関係)今までのHSPではpokeや<<,+演算子を使用して無理矢理、int型の中に入れていましたがこれはいろいろと面倒(int+char+int...とか)なのと余った分(int+charとか)がジャマなんです。ファイルに保存するときなどにそこは0x00で埋められてしまいますが元々からないことにして欲しいということです。
- それなら、pack/unpackの様なアラインメント変換をする命令があれば十分じゃないかと。
- 8ビット+16ビット+32ビットの構造を持つバッファをHSPで処理するにはpeekやpoke,memcpyなどのメモリを操作する命令や関数で直接操作しますがint型変数の配列を複数またいでしまい、雰囲気(?)的に好ましくないような感じがするんです。これは構造体の実装をも含む内容になるのですがそれを考えない場合でも例えばファイルに保存する際にint型変数だと32ビット分保存されますが(空白ビット分は0で埋まる)8ビット変数を利用した場合は8ビット分のみ保存されるなど処理的に便利なんです。RGBのような8ビット毎のデータが必要な場合においては現在のpeekやpokeを使用する方法では面倒で大変ですがこれを8ビット変数3つ用意すれば配列で各RGBにアクセスできます。こういう用途に使用したいということです。
構造体のサポート
どの言語でも普通はありますよね。
- そうでもないと思いますけど:)
- HSP3に追加予定の機能のリストにあるように連想配列が追加されます。レコード型としてはこれで十分ではないでしょうか。
- 3.0の連想配列は、キーだけで、値は型固定です。でも、可変長が云々ってあるので、サポートの可能性も?
- でも構造体はWin32APIとか使用する場合によく出てくるので結構必須だったりするかも・・・簡単に利用できるといいですね。(現状でも配列に順番通りに代入していけば出来ないことはないですが面倒な上にサイズの異なる型の変数を代入する際はその計算が非常に大変です)DLLで実装する・・・なんて事も3.0では出来るかも知れませんが。
- そういや、SDKにある構造体っぽいヤツは何?
- モジュール変数を構造体の代わりとして使用できるといいですね。
- SDKにある構造体っぽいヤツは、モジュール変数用でした。データ構造は構造体じゃないけど、これを本物の構造体と相互変換する事は可能かも。
- 逆に、構造体は(HSPでは)API以外で使われることはないと思いますので、取り立てて重要とも思えないのですが。HSPでは初級者がAPIを使うことは想定していないでしょうし、APIを扱えるレベルなら数値型配列変数での取り扱いでもあまり問題にならないと思います。API呼び出し機能は、HSPのメインの機能ではなく、あくまで補助的なものだと思います。API呼び出しのラッパーとなるモジュール命令を作ってしまえば、構造体の扱いが大変なのは最初の1回だけでしょうし。
- さらに、構造体をサポートすると、インタプリタであるHSPではかなり複雑になりそうな気も。構造体のメンバの名前や型の情報をどのような形で定義するのかは分かりませんが、それらの情報をオブジェクトファイル(.ax)に含めることになり、最終的なEXEのサイズにも影響が出ますよね(コンパイラ言語ならこの辺の問題はないんですけど)。入れ子の構造体などはさらに大変かも。
- 構造体をHSPで無理矢理実現させるようなモジュールを作ってみた(HSP3標準ライブラリ:struct.as)のですが正常動作するかどうかは保証できません。これを作ってみて思ったのですが所謂、各要素でサイズの異なる領域を設定でき、各要素に名前(変数名)でアクセスできる配列変数(各要素はintと同様メモリ上に連続で格納されている)が実現できればいいなと思いました。char+int(1+4)とかHSPでこういう構造の構造体を実現させるのは面倒なんですよね。(int+charやint+intなどなら4+1,4+4なので難しくないですが)
モジュール変数をグローバル上からまとめてファイルに保存
モジュール変数の中身をグローバル上から指定すると丸ごとファイル保存したい。
例
#module ball x, y
#modinit newball str a, int b
x = a : y = b
return
#global
repeat 0x10
newmod a, ball, strf("%c", 'A' + cnt), cnt
loop
bsave "save.bin", a
mes "OK"
stop
↓
(ファイルのバイナリダンプ)
41 00 42 01 43 02 44 03 45 04 46 05 47 06 48 07
49 08 4A 09 4B 0A 4C 0B 4D 0C 4E 0D 4F 0E 50 0F
ある程度予測で書いたので少し結果が異なる可能性もあり。
モジュール変数で宣言している順に変数毎に格納。(?)
↑x = "ABCDEF" : y = 1 ↓
44 43 42 41 00 46 45 01 00 00 00
数値は数値,文字列は文字列で保存。
出来れば例のように1バイト数値は1バイトのみ2バイト数値は2バイトのみ4バイトは4バイト...自動保存。(というより切り分けたいのでintより小さい数値型があるといいかも)
文字列の場合、NULLを含める・含めないの両方があるといいかも。
- モジュール変数は任意に型が変わりうるので、変数型情報も保存する必要があるのでは?
- 保存するときにその時点の内容をファイルに保存したいと言うだけなので・・・。簡単に言えばモジュール変数をCの構造体みたいにして使用したいという要望を含みます。(構造体のサポートのところに追記しました)
- XDR(RFC 1014,1832)やASN.1や(net)CDFのようなネットワーク標準の命令をHSPに追加してもらえば解決だと思います。
- 保存・読み出し用のモジュール命令を自分で実装するだけでいいとおもいますが。そもそも、モジュールによっては、すべてのモジュール変数のデータを保存する必要がないでしょうし。そのようなモジュール依存の機能は、モジュール命令として実装するのが一番です。
- 簡単に言えばモジュール変数を(モジュールの)外部からCなどの構造体やクラスなどと同等の扱いで操作したいということなんです。上の「標準型の充実」や「構造体のサポート」のところにも書いたように構造自体が複雑な(複数の型やサイズのある変数を持つ配列)を処理する場合に一発でできると便利だなと。
|