スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JavaScriptの(主にMozillaによる)独自拡張のまとめ

MozillaはJavaScriptに様々な拡張を施してる。 JavaScript - MDCから辿って得られる情報から、Mozillaの(独自)拡張をまとめてみた。

JavaScript 1.5 / Netscape由来

定数
const a=123;
alert(a); // 123

MozillaだけでなくSafari、Chrome、Operaなどでも使える。

条件付きcatch節
try {
  throw 123;
} catch (ex if ex == 123) {
  alert(ex); // 123
}

instanceofと組み合わせて使うことが多い。

JavaScript 1.6

for each...in
for each (var x in {a:1,b:2,c:3}) {
  alert(x); // 1 → 2 → 3
}

JavaScript 1.7

Generators and iterators
function gen() {
  for (var i = 0; i < 3; ++i) {
    yield i;
  }
}
var g = gen();
alert(g.next()); // 0
alert(g.next()); // 1
alert(g.next()); // 2
alert(g.next()); // StopIterationが飛ぶ
Array comprehensions
[i+i for (i in {a:1,b:2,c:3}) if (i == "a")] // ["aa"]
Block scope with let
// let式
var z=5;
alert(let(x=1,y=2,z=z+2) x+y*z); // 15
// let文
let(x=1,y=2,z=z+2) {
  alert(x+y*z); // 15
}
// let宣言
let x=1,y=2,z=z+2;
alert(x+y*z); // NaN (実は上の行のz+2では新たに宣言されたzが参照される)
Destructuring assignment
var [a,,c] = [1,2,3];
alert(a+c); // 4
識別子の扱い
JavaScript 1.7 の新機能: Days on the Moonより。
var o = {do: function () { alert("Hello"); }};
o.do();

JavaScript 1.8

Expression closures
var f = function(x) Math.sqrt(x);
alert(f(81)); // 9

ただのシンタックスシュガー。

Generator expressions
var gen = (i+i for (i in {a:1,b:2,c:3}) if (i == "a"));
alert(gen.next()); // aa
alert(gen.next()); // StopIterationが飛ぶ

おまけ: ECMAScript 5

オブジェクトリテラル中でのget/set
var o = {get hoge() { return "hoge"; }};
alert(o.hoge); // hoge

2010/03/28:誤記修正

スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

JavaScriptで多倍長整数

単純な物だけど実装した。というか、前に作った物を動くようにした(特に除算)。暇があれば公開する。

WebだとGMPなどの既存のライブラリを活用できないのがつらい。

JavaScriptに演算子オーバーロードが欲しい。

テーマ : プログラミング | ジャンル : コンピュータ

複号

プラスマイナス(±)やマイナスプラス(∓)のことを複号というが、複号にはこの他に≶というのもあるようだ。なんて読むんだろう。

Luaのノウハウその3 - luaL_checkudataとその仲間たち

luaL_checkudata,luaL_newmetatable,luaL_getmetatableについて。 これらの関数は、Cのデータ型へのLuaバインディングを書く時に使われる。標準ライブラリではliolib.cとloadlib.cで使われている。 それぞれの関数の使い方については、リファレンスマニュアルにちゃんと載ってるのでそっちを参照。←丸投げ

典型的な使い方

  1. luaopen_xxxでluaL_newmetatableを呼び、メタテーブルを作る。必要なメタメソッドを登録する。
    luaL_newmetatable(L, "MyType"); // 作って
    luaL_register(L, NULL, funcs); // 必要なメタメソッドを登録
  2. 新しくユーザーデータを作る時に、メタテーブルを設定する。
    MyType *p = (MyType *)lua_newuserdata(L, sizeof(MyType));
    luaL_getmetatable(L, "MyType"); // レジストリからメタテーブルをとってきて
    lua_setmetatable(L, -2); // 新しく作ったユーザーデータに設定
  3. C関数中で、ユーザーデータからCポインタを得たい時にluaL_checkudataを呼ぶ。
    static int mytype_hoge (lua_State *L) {
      MyType *p = (MyType *)luaL_checkudata(L, 1, "MyType");
      // pでいろいろ
    }

FAQ

  • Q. スタックの指定した位置にある値が型tnameのユーザーデータかどうか調べたい。luaL_checkudataにエラーを投げさせたくない。
    A. luaL_checkudataのソースコードを参考にして自分で関数を書きましょう。Lua 5.2でluaL_testudataという関数が追加されるまでの辛抱です。

テーマ : プログラミング | ジャンル : コンピュータ

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。