HSP

後ろで定義されている関数を呼び出せるようにするパッチ その2

後ろで定義されている関数を呼び出せるようにするパッチ - fujidigの雑記 の改良。 前のパッチは codegen で識別子の @ がどうこうしているのが心残りでした(SearchSymbolOrRegisterVarまわり)。 識別子の @ の処理とかはプリプロセスで済ますべきだったと思…

ラベル型変数を使って無理やり動的メソッド呼び出しを実現してみる

HSP

※ 黒魔術注意。この記事には実用的なスクリプトはありません。 dog_cry_impl, doc_cry と二段構成になっていて、 animal_cry を #modfunc でなく #deffunc なのは、メンバの参照時に違うモジュール内の #modfunc からジャンプしているかチェックしてそのとき…

await 命令

HSP

#uselib "winmm.dll" #cfunc global timer "timeGetTime" #module #deffunc sleep int n start_time = timer() while timer() - start_time < n ; wend return #global wait 0 sleep 100 ; 処理に 100 ms 時間かかった st = timer() await 1000 ed = timer()…

後ろで定義されている関数を呼び出せるようにするパッチ

改良しました -> 後ろで定義されている関数を呼び出せるようにするパッチ その2 - fujidigの雑記 だいたい以下のような仕組みです。 プリプロセス時のラベル情報を使って関数の名前を type = TYPE_MODCMD, opt = -1 で登録 opt = -1 の関数の呼び出しがあっ…

HSP on JS のモジュール変数

こんなスクリプトが動きます。 #module mod_human m_name #modinit str name m_name = name return #defcfunc new_human str name, local instance newmod instance, mod_human, name return instance #defcfunc human_get_name modvar mod_human@ return m_…

明らかに関数の内部に不正な方法で入ってくることがない関数を静的に調べたい

HSP

HSP では goto などで関数の内部に外側から簡単に入ったりできる。そのために仮引数やローカル変数の参照、代入や return がその関数がスタックトップの状態で実行されるかということが静的には分からない。でも、明らかに不正な方法で関数内部に入ってくる…

HSPLet と HSP on JS の Reference の違い

a.1 = 12345 dup b, a.1 a = 0.0, 1.0 mes "<"+b+">"で、HSPLet は を表示するけど、 HSP on JS では . HSPLet の Reference は Variable を参照先にすることがあるけど、 HSP on JS の Reference は Variable を参照先にすることはなく、 HSPArray のインス…

配列変数の添え字

#module #deffunc f var a sdim a@, 64, 3 a@.0.0 = "A", "B", "C" a@.0.1 = "D", "E", "F" mes a return #global f a.1.1オフィシャル HSP はこれで "D" が出るけど、 HSP on JS では "E"。オフィシャル HSP では変数オブジェクト(PVal)と配列を一直線に…

PValアドレスとAPTRってHSPCTX::prmstackを経由しなくてもとれる その2

HSP

PValアドレスとAPTRってHSPCTX::prmstackを経由しなくてもとれる - fujidigの雑記 で mref を使って PVal と APTR を取得するということをしましたが、新たに PVal と APTR を取得する方法を発見。 code_get の TYPE_STRUCT でちゃんとチェックしてない - fu…

code_get の TYPE_STRUCT でちゃんとチェックしてない

HSP

こんなコードで落とせる。 #module #deffunc f var p *a mes p return #deffunc f2 goto *a #global f2まあ、それを利用(悪用?)して、こんな風に関数本体の定義を下にかけたりできるわけだけど。 #module #deffunc f int a, double b, str c goto *lab_f_…

STRUCTDAT, STRUCTPRM あたりを調べた

HSP

HSP on JS でそろそろユーザ定義命令・関数を実装するかーと思ったんで、理解が浅い STRUCTDAT, STRUCTPRM あたりを調べることにした。結構複雑。 STRUCTDAT ユーザー定義命令・関数や DLL の関数、モジュール変数定義の情報。 ax の FINFO にこれの配列が格…

JavaScript による HSP インタプリタ HSP on JS

http://www.fujidig.com/hsp-on-js/samples.html HSP on JS は JavaScript による HSP のインタプリタの実装です。 CodeRepos にリポジトリを置いて開発しています。 対応している機能 まず、 GUI 描画命令はありません。 mes 命令を実行したら textarea に…

HSP の文字列

HSP

式での文字列と変数で管理している文字列のバッファを分けて考えたらいいんじゃないかと思った。 式での文字列 不変 '\0' を含まない 文字列型変数から式へ: '\0' までを取り出す 変数で管理している文字列のバッファ 可変。 代入や連結、 poke や memcpy な…

ラベル型変数のvaruse

HSP

*first dimtype a, 1 b = *first c = *last mes varuse(a) ; >> 0 mes varuse(b) ; >> 0 mes varuse(c) ; >> 1 d = a, b, c mes foreach d ; 0, 1 は skip される mes cnt ; >> 2 loop *lastvaruse ってコード先頭を指すラベルかどうかを調べているだけじゃ…

連続代入の評価の順番

HSP

#module #defcfunc f mes a@ return 0 #global a = 111 a = 222, f()は 111 を表示するでしょうか、それとも 222 を表示するでしょうかーという話。 オフィシャル HSP でも HSPLet でも 222 でした。 こんなもの、HSPの仕様的に決まっているとも思えないので…

dim a, 1, 0, 1 とかいけるのか。

HSP

dim a, 1, 0, 1 mes length(a) mes length2(a) mes length3(a) mes length4(a)1 0 1 0こんなlengthもいけるのかー。 とりあえず今は 1 1 1 0 になっても困るようなケースはほとんどないと信じておく。

a(0,0) = 1, 2, 3 と a(0,0) = 1 : a(1,0) = 2 : a(2,0) = 3 は等価じゃない

HSP

a(0,0) = 1 : a(1,0) = 2 : a(2,0) = 3 はエラーになるもんね。そうだったそうだった。 - ってアッッ! a(0,0) = 1, 2, 3 も実行したらエラーになった。 ああ、なんだ。そうだったのか。 ということで、「等価じゃない」というのはうそでした。

四次元より大きい次元の指定はエラーにならず単に無視される

HSP

dim a, 1, 1, 1, 1 mes a(0, 0, 0, 0, 0)a(1,1,1,1,1) = 1どっちもエラーにならない。

HSPLet 次元をまたいで連続代入されてしまう

HSP

dim a, 3, 3 a.1.0 = 111, 222, 333 repeat 3 : y = cnt repeat 3 : x = cnt mes "a("+x+","+y+") = "+a(x,y) loop loopこれ、オフィシャルHSP3だと代入のところでエラーになる。 HSPLetなら通ってしまう。 a(0,0) = 0 a(1,0) = 111 a(2,0) = 222 a(0,1) = 3…

PValアドレスとAPTRってHSPCTX::prmstackを経由しなくてもとれる

HSP

mrefのリソースID 0, 1 を使うってだけ。 #module #defcfunc get_pval1 var mref hspctx, 68 dupptr vptr, hspctx(207), 4 return vptr #defcfunc get_aptr1 var mref hspctx, 68 dupptr vptr, hspctx(207)+4, 4 return vptr #global #module #defcfunc get_…

クローン変数で配列の自動拡張が行われない

HSP

a = 1, 2, 3 dup b, a b.5 = 42 ; error!謎仕様

CStrLineIterator クラスを導入して listbox を高速化

2ch プログラム技術スレ「API ┣━┫HSP上級者専用スレッドvol.0x01┣━┫MCI」 >>525 CStrNote で行頭位置をキャッシュするパッチが投稿されていました。 listbox が高速になっていい感じなんですが、 note 系命令を使ったプログラムは逆に遅くなってしまいます。…

global 指定されたマクロとモジュールローカルなマクロの名前がかぶったときの挙動

HSP

#define global A 111 #module #define A 222 #deffunc f mes A ; >> 111 return #global mes A ; >> 111 f5 行目の A ではモジュールローカルの方の 222 を優先してほしいなあー。 #uselib "USER32.DLL" #func global MessageBoxA "MessageBoxA" sptr,sptr,…

__include_level__ マクロ

Perl の __FILE__ eq $0 、 Ruby の __FILE__ == $0 、 Python の __name__ == "__main__" みたいなものがほしいなーと思った。 Index: token.cpp =================================================================== --- token.cpp (リビジョン 164) +++…

HSPLet あれこれ

HSP

仮引数へ代入が可能 #runtime "hsplet3" #module #deffunc f int a mes a ; >> 123 a = 456 mes a ; >> 456 return #global f 123 仮引数が静的にふるまう #runtime "hsplet3" #module #deffunc f int a if a >= 5 : return mes "" + b + ", " + a b ++ f a …

HSP 3.2b1 で 変数型を拡張するプラグインでうまく動作しない件についてのメモ

hsp3.2b1においてコールバック関数実装プラグインが使用できない この問題は Shark++ さんが修正してくれました。 Shark++++原因は DLL を開放した後で DLL 内の関数を呼んでしまう箇所があったから。それは、 DLL で拡張された変数の開放関数。(HspVarProc…

HSP 3.2b1 と 3.1 でフィボナッチのベンチマークで速度比較

HSP

HSP3.2β1 が出ましたね! HSP3.2β1では、パラメーター取得とスタック処理を見直すことで、多くのスクリプトで実行速度が向上しています。 ということなので、どのくらい変わっているかフィボナッチ数を求めるプログラムで速度比較してみましたよ! スクリプ…

int OP double を double で演算するパッチ

HSP では int OP double が int で演算され、 たとえば 100 * 0.9 で 0 が返ってきたりするのが HSP の不満ポイントの一つなんですが。 int OP double を double で演算するパッチを作ってみました。 Index: hsp3code.cpp =================================…

HSPコンパイラのSEGVを修正してコミットしました

http://dev.onionsoft.net/trac/changeset/85 色々調べてみて分かったんですけど、 Endless macro loop エラーが出なかったのは単に macloop が 1000 に達するより早く SEGV が起こっていたから。 b %1の%1がなければ落ちなかったのはただの文字数の問題。 …

HSPLet のコンパイラをコマンドラインから

HSP

java -jar "c:\program files\hsp31\hsplet\compiler.jar" Compiler --jar=hoge.jar --html=hoge.html --pack=hoge.ax --startClass=hoge --title="Promgram Title Here" --libdir="c:\program files\hsp31\hsplet\ext" --libdir="c:\program files\hsp31\hs…