2008-09-01から1ヶ月間の記事一覧

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!謎仕様