HSP on JS GUI の試み

HTML5 Canvas を使って HSP on JS で GUI のスクリプトを動す試みです。 http://www.fujidig.com/hsp-on-js/gui-trial.html http://coderepos.org/share/changeset/23304 といっても、まだ color 命令と boxf 命令しかありません...。 Firefox, Opera, Safar…

V8 (Google Chrome) でのバグ(switch - caseで間違えてdefaultに飛ぶ)

JS

V8 version 0.4.2.1 (trunk rev.678)で以下のコードで「3!」が出力されるべきなのに、「default!」が出力されます。(Google Chrome 0.3.154.9 でも再現するバグです) var a = 3; a += 0x7fffffff; a -= 0x7fffffff; switch(a) { case 0: break; case 1: br…

with と function 文

JS

var Foo = {}; with(Foo) { Foo.Bar = 1; function f() { Bar; } } f(); は Firefox ではエラーが出ないけど、 IE, Safari, Opera, Google Chrome で ReferenceError が出る。 var Foo = {}; with(Foo) { Foo.Bar = 1; var f = function f() { Bar; } } f();…

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 にこれの配列が格…

文字列のnバイト目がShift_JIS(CP932)のマルチバイト文字の後続バイトか調べる

Shift_JISのマルチバイト文字後続バイトの範囲内の str[index] がマルチバイト文字の後続バイトかを調べる。 index が 0 なら false を返す str[index-1] がマルチバイト文字先行バイトの範囲内でなければ false を返す str[index-1] がマルチバイト文字後続…

文字列のn行目のインデックスを取得

JS

文字列のn行目の先頭が文字列先頭から何文字目かを取得する関数。 4 つ書いてみた。 function getLineIndex1(str, lineno) { var curline = 0; var len = str.length; for(var i = 0; i < len; i ++) { if(curline == lineno) return i; var c = str.charAt(…

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 ってコード先頭を指すラベルかどうかを調べているだけじゃ…

仮引数に代入するとargumentsで得られる値も変動するんですね...

JS

(function(a){a=1;return arguments[0]})(9,8,7) // => 1知りませんでした><

連続代入の評価の順番

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 になっても困るようなケースはほとんどないと信じておく。

配列の最後から n 個値を取得するときに arr.slice(-n) とすると n が 0 のとき期待しない値になる

JS

タイトルどおり。 スタックから n 個 pop するときに var args = stack.slice(-argc); stack.length -= argc; とかしてたんだけど、これだと argc が 0 のとき args が空の配列でなく stack 全体のコピーになってしまう。 これでハマった。 - はてさて、どう…

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_…

SleepVM に関数呼び出しを追加してみた

JS

るびま には宿題として関数呼び出しを実装してみろ、というのがあったのでやってみました。 http://www.fujidig.com/misc/js/sleepvm2.html サンプルのプログラムとしてユークリッドの互除法をやってみました。 # goto :main :gcd # ユークリッドの互除法 ge…

RubiMaVM の JS 移植版に sleep をつけてブラウザで固まらずに複数動作できるようにしてみた

JS

http://www.fujidig.com/misc/js/sleepvm.html

RubiMaVM を JavaScript に移植してみた

JS

VM に興味がわいたので るびま を読んだ。 そして、 RubiMaVM を Javascript に移植してみた。 var RubiMaVM = {}; RubiMaVM.Instruction = function Instruction(code, opts) { this.code = code; this.opts = opts; }; RubiMaVM.Instruction.prototype.toS…

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

HSP

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

Shift_JIS(CP932)の重複している文字の列挙

参考: Microsoftコードページ932 - Wikipedia 出力結果: http://www.fujidig.com/misc/sjis-duplication.txt なんか自分の区番号の認識が間違ってたぽい。第二バイトが40-7Eだったら奇数で80-FCだったら偶数と思ってたんだけど。正しくはどうなんだろう 区点…

CStrLineIterator クラス てすとけーすつき

CStrLineIterator クラスを導入して listbox を高速化 - fujidigの雑記 で作った CStrLineIterator クラスをてすとけーすつきで。 CStrLineIterator::next メソッドでバッファサイズが足りないときに -1 を返してるんですけど、次に next を呼んだときにはも…

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

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

Ruby 1.9 SUPPORT_JOKE の bitblt を試してみる

$ cat bitblt.rb def bitblt c = nil 10000.times { a = [1, 1606, 396, 933960, 3775901511, 1044, 244711859] b = a.map {|i| s = '' while i > 0 i, a = (i-1).divmod(26) s << 97 + a end s.reverse } b[3] += ',' c = b.join(' ') } c end p bitblt $ t…

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,…