IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

mozilla の JavaScript は実装上 lvalue-return できる

lvalue-return とは

Perl とかの substr のような

$file = "hoge.pl";
substr($file, 5) = "js";
print "$file\n"; # hoge.js

左辺値に関数コールがくる形

JavaScript は lvalue-return できる。

SpiderMonkey の js コマンドでこういう感じ

$ js
js> it.item(1) = 1;
1
js> it.item(1)++;
1
js> it.item(1);
2

しかし

lvalue-return できる関数はネイティブからしか作ることができない。
しかも、ブラウザに実装されてる関数で lvalue-return できるものはない。
ので、使うことはほとんどなさそう。

lvalue-return の実装方法

JSAPI にある JS_SetCallReturnValue2 関数を使う

// 例 js.c の it.item の実装
static JSBool
its_item(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
    *rval = OBJECT_TO_JSVAL(obj);
    if (argc != 0)
        JS_SetCallReturnValue2(cx, argv[0]);
    return JS_TRUE;
}

使ってみたぃょぅ><

ちなみにまだ実装例はあまりない
http://www.google.com/codesearch?q=JS_SetCallReturnValue2&btnG=Search+Code

0 ビットシフトで整数の符号ビットを落とす。

>>> 演算子は符号ビットを無視してビットシフトする演算子です

これで、 0 ビットシフトしたら符号ビットだけ無視して再評価するのでは?と思って

やってみた

alert((-1 >>> 0).toString(16)); // ffffff

できた

応用

補数を返す関数

function hosu(x){return -x>>>0}

で?

それだけ><