読者です 読者をやめる 読者になる 読者になる

Write and Run

it's a simple way, but the only way.

ES.next の const と Node.js

Jail 内の Prisoner が無事に外側のネットワークとおしゃべりできるようになってとても嬉しい KOBA789 です。VIMAGE でネットワークスタックも分離してるんですよ! 仮想ネットワークですよ! という話は明日書きます。今日は ES.next の const と、みんな大好き Node.js の話。

発端

ある日、メールボックスを開けるとなんかアレなトピックが投稿されていた。
f:id:koba789:20120116160619p:plain
以下、nodejs_jp の MLより投稿をいくつか引用。

shimaden

こんにちは。 shimaden と申します。

Node.js のモジュールを書くときに strict モードは使えますでしょうか?
過去のMLをみたところ、ryan は「V8 で問題がなければ strict モードを必須にするかもしれない」
と言っているようですが。(英語に自信がないので間違っていたらごめんなさい)
http://groups.google.com/group/nodejs/browse_thread/thread/d3c1d1f7931870ed

「ほう、strict モードとな。」
そういえば自分は、OAuth-Revenge で Object.freeze したオブジェクトが変更された際に例外をスローさせるため、strict モードを使ったことがありました。
というわけで返信。
カチャカチャ……ッターン

KOBA789 です。

使えますよ。自分が作ったモジュールの一部では、Object.freeze したオブジェクトを書き変えようとしたときに例外をスローさせるために有効にしています。

http://github.com/koba789/oauth-revenge/

ちゃっかりモジュールの宣伝もしました。

そして今日

Shin Suzuki

こんにちは。

strict modeにするとconst宣言が使えなくなります。
constもstrict modeも保守性をあげるために有用だと思っているのですが、
両方同時には使えません。

お、const の話題が。そうそう、strict だと const 使えないよねー。Object.freeze は便利になるのになんかジレンマ。
するとそれに返信が。

Koichi Kobayashi

小林 (koichik) です.

そもそも既存の const は ES5 の一部ではない、各処理系
(Node にとっては V8) の独自実装にすぎないわけですしおすし。
# 言い過ぎ? Netscape/Mozilla 原理主義 (いるのか?) の人、怒らないで

そうそう、const って元々独自実装で、IE なんかだと無いんだよねー。
↓続き↓

しかし!!

現在開発中の Node v0.7 系 (未リリースなので master から自分で
ビルドする必要あり) が採用している V8 3.8 では、--harmony_scoping
(または --harmony) オプションを指定することで、ES.next の const を
使用することができます。

例:

function a() {
 'use strict';
 const y = 0;
 y = 1;
}


普通に実行すると、strict モードで const を使ってると怒られます。

$ ./node /tmp/a.js

/tmp/a.js:3
 const y = 0;
 ^^^^^

node.js:216
       throw e; // process.nextTick error, or 'error' event on first tick
             ^
SyntaxError: Use of const in strict mode.
   at Module._compile (module.js:429:25)
   at Object..js (module.js:452:10)
   at Module.load (module.js:353:31)
   at Function._load (module.js:310:12)
   at Array.0 (module.js:472:10)
   at EventEmitter._tickCallback (node.js:207:40)


--harmony_scoping オプションを指定して実行すると、const な変数に
代入していると、「文法エラー」になります。

$ ./node --harmony_scoping /tmp/a.js

/tmp/a.js:4
 y = 1;


node.js:216
       throw e; // process.nextTick error, or 'error' event on first tick
             ^
SyntaxError: Assignment to constant variable.
   at Module._compile (module.js:429:25)
   at Object..js (module.js:452:10)
   at Module.load (module.js:353:31)
   at Function._load (module.js:310:12)
   at Array.0 (module.js:472:10)
   at EventEmitter._tickCallback (node.js:207:40)
~/git/joyent/node$


実行時エラーではないことに注意。そもそも a() を呼び出していないので、
再代入は実行されていないのです。
詳しくは Const なんとか先生のこちらをどぞー。

http://d.hatena.ne.jp/Constellation/20111201/1322678350

マジっすか!!!
Node.js で ES.next が使えるんですか!
これは使ってみるしかない!!

準備

相変わらず前置きが長いですね。ようやく準備です。ソース取得からビルドまで一気に行きましょう!

$ git://github.com/joyent/node.git
$ cd node
$ ./configure
$ make -j6
$ ln -fs out/Release/node node
$ ./node -v
v0.7.0-pre

うむ。

筆者は力尽きました

続きは明後日書きます。
明日は FreeBSD jail with ZFS and VIMAGE の話。