javascript

ハッシュのキーをプロパティに変換

 

JavaScript の場合は、次のように何もする必要がありません。

$ js
js> x = { 'foo': 123, 'bar': 456 } 
js> x.foo
123
js> x.bar
456

Ruby の場合は ostruct を使うのが簡単です。 ostruct については、 LukeSilvia さんが はてブコメントで教えてくれました。 どうも、ありがとうございます。

$ irb --prompt simple
>> require 'ostruct'
>> x = OpenStruct.new({ 'foo' => 123, 'bar' => 456 })
>> x.foo
=> 123
>> x.bar
=> 456

最初に書いたメタプログラミング版は、もはや使うことは有りませんが、 興味深いので残しておきます。

Googleの検索結果に「はてブ」を表示(サーチウィキ対応)

 

はてなブックマーク Firefox 拡張 1.2.0 (はてなブックマーク日記)
“本日 Google / Yahoo! の検索結果に、はてなブックマークの情報を表示する機能を追加したはてなブックマーク Firefox 拡張 1.2.0 をリリースしました。”

2009-07-23


SearchWiki の日本語版がスタートするとともに、検索結果に「はてブ」を表示する Greasemonkey が動かなくなってしまいました。

Japanese Popular SBM Count With Google の利用者は、 これで解決できそうです(試していません)。

それでは、G+?B(いぬビーム) の利用者はいますか? なぜか私は G+?B を使っているので、こちらを修正して使うことにしました。

インストール

関数型 - Yコンビネータ

 
Yコンビネータのシナリオ:
  • Yコンビネータ(こんな感じのやつ → Y(F) = F(Y(F)) )を無心に写経する。
  • サンプルとして fact(10) を計算する。
  • 変数名としても関数名としても、fact の名を冠するものは登場しない。

関数型 - メモ化 Memoization

 

SICP Exercise 3.27.

メモ化のシナリオ:
  • 高階関数 memoize は、引数で渡された関数に対して、計算結果のキャッシング機能を追加する。
  • memoize の戻り値はキャッシング機能付きの関数で、これを変数 fib を通して使用する。
  • キャッシング機能によって、計算量の爆発が抑えられることを確認する。
  • 具体的には fib(1000) を計算する! これは、メモ化されていない fib(30) よりも遙かに速い。
  • 計算結果の桁数が200桁を越えるので、可能であれば多倍長整数を使用する。

関数の実行時間を計測するには?

 
  • 処理系で用意されている方法があるなら、それを使用する。
  • 無ければ、関数の実行時間を計測する関数 time を作成する。
  • 計測対象のサンプル関数として、フィボナッチ数を計算する fib を作成する。
  • 計測単位は、可能な限り秒(sec)とする。
  • 計測精度はミリ秒でもマイクロ秒でも構わない。

関数型 - イテレータ

 
イテレータのシナリオ:
  • 高階関数 myEach は、配列要素を1つ取り出すごとに、これを引数としてコールバックを行う。
  • 呼び出し側は、3の倍数を見つけたらプリントする。
  • myEach は、可能であれば組み込み型の拡張として実装する。 このとき継承は使わない。

処理系のインストール

 

記事で使用している処理系のインストール方法、 及びシェルの起動と終了について記載します。

関数型 - 無限リスト

 
無限リストのシナリオ:
  • 無限に続く奇数列 (1, 3, 5, 7, 9 ...)、odd を作成する。
  • 最初の10件を配列(リスト)に取り込む。

JavaScript 機能チェックツール

 

JavaScript の機能チェックツールを作成しました。 eval 関数を使用してコードを評価するため、 従来のオブジェクト検知方式よりも広範囲なチェックが可能になっています。

最新バージョン

Safari 4 Beta で実行した場合(素晴らしい!):
Safari 4 Beta で実行した場合

JavaScript に new 演算子は要らない

 

JavaScript ほどの記述性の高さがあれば、実は new 演算子は要らないのではないか? という疑惑を抱いて悶々としていたのが解決しました。

気になっていた JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス を入手してパラパラめくったら、信じられないことに「悪いパーツ」に new 演算子が載っているではありませんか!

本書では new 演算子を使うべきでない理由を述べるとともに、関数型パターンによるアプローチを紹介しています。 ここでは気に入ったフレーズだけ引用しておきます(p.57)。

擬似クラス型のスタイルは、JavaScriptになじみのないプログラマに安心感を与えることができる。 しかし同時にこのスタイルは、JavaScriptの本質を隠してもしまう。
何故、このフレーズが気に入ったのか? それは「本質」という言葉が好きだからです :-)

JavaScriptエンジンのベンチマーク

 

インストール - JavaScirpt (V8, TraceMonkey, SFX)」 でインストールした JavaScriptエンジンについてベンチマークを実施しました。

Nightly Builds を使用している関係もあって、 まだブラウザに組み込まれていないバージョンでのベンチマークです。 これは、ブラウザトータルでのベンチマークについてはとりあえず横に置いておいて、 JavaScriptエンジンの素性を見るという意味合いになります。

WebKit をチェックアウトすると、 コマンドラインで V8 Benchmark Suite、SunSpider などを動かすことが出来ます。 具体的な方法は後述するとして、先に結果をまとめます。 単位はベンチマークの種類に関係なく、すべて ms で統一されます。 つまり、数字が小さいほど速いということです。

JavaScriptエンジンV8 SuiteSunSpiderubench
V8 v0.4.9.3 1903.9ms 913.8ms 705.6ms
TraceMonkey2008-12-1629537.4ms1423.2ms 124.6ms
SFX r40737 8165.4ms2004.5ms1161.5ms

JavaScript とクロージャ

 

クロージャ は、1960年代に抽象プログラミング言語 ISWIM のVMである SECDマシン の機能として考案されました。 1970年代に入ると、このクロージャを実装した最初のプログラミング言語が登場します。 関数型言語の Scheme です。

1990年代に入ると、超高水準言語(VHLL)の一派である Ruby と JavaScript が、クロージャで完全武装して登場します。 あまりにも凄すぎて、その姿は誰にも見えませんでしたが、ついに2000年代に入って再発見されるのです!

2000年代に入ると、クロージャは C# や PHP にさえも実装され、もはや近代のプログラミング言語においては必須機能となりつつあります(Java への実装も提案されていますが、実現は難しそうです) 。

このような流れの中で、クロージャはクラス絶対主義に対して(プチ)パラダイムシフトをもたらす、なんてこともあるかも知れません。

本稿は、そんなクロージャについて書かれた記事へのリンク集です。 タイトルは「JavaScript とクロージャ」としましたが、JavaScript 以外の言語も含まれています。 

JavaScript でプリントデバッグするには?

 

alert 関数を使用しないでプリントデバッグする方法を、ブラウザごとに紹介します。

更新内容

2009-02-27
Safari 3 から Safari 4 へ変更。

2009-01-31
Chrome 2 と IE8 を追加。 プリントデバッグの検証ページを追加。

ブラウザ評価ツールのまとめ

 

ブラウザの評価ツールを集めました。 「JavaScript のパフォーマンス」「ウェブ標準への準拠状況」を評価できます。

2009-04-14、TaskSpeed を追加。
合計で 12 件あります。

モダンJavaScript チュートリアル集

 
JavaScript のシンボル Rhino

JavaScript (ECMAScript) のチュートリアルを集めました。

2009-10-05、1件追加しました。
合計で 17 件あります(コアJavaScript のみカウント)。

Amazonで検索:  javascript

目次