いい加減 HTML を書いて <script> でスクリプトを読み込ませて Firefox の JavaScript コンソールでデバッグ、っていうのに疲れたのでコマンドラインで動くものはねーのかと以前から調べていた Rhino を動かしてみた。(これ、らいのぅって読むのね。知らんかった。)Java が必要だけど、最近のクライアントOS ではフツー入ってるので気にしない。逆に Java はないけど gcc はあるよってゆー BSD 使いとかの人は SpiderMonkey を使え。
で、困ったことに Rhino のページに書いてある通りにやっても動かない。CLASSPATH の設定というのが超基本的にすぎて端折ってあるので。やるのはこんな感じ。(例は .zshrc)
export CLASSPATH=/usr/local/bin/js.jar:$CLASSPATH
alias jrunscript='java org.mozilla.javascript.tools.shell.Main'
Win の場合は適当にバッチファイルにする。名前は Java SE 6 Mustang じゃじゃ馬ならし Scripting から jrunscript にしておく。そうすっと最終的には
jrunscript -f scriptfile
だけでおけ。
…なんか使いにくいなぁ。readline とかその辺ですか? SpiderMonkey で JavaScript のインタラクティブシェル で読むのと違って編集とかできないし。んー。
※ その後、rlwrap をかましたら超絶便利になりました!
参考
以下の3つの環境でだいたい期待通りに同じ動作をする puts() 関数です。
- ブラウザ
- Windows Scripting Host
- Rhino の shell(SpiderMonkey は未確認)
function puts( message ) {
try {
document.write( message + "<br>" );
} catch ( e ) {
try {
WScript.echo( message );
} catch ( e ) {
try {
print( message );
} catch ( e ) {
;
}
}
}
}
WSH スクリプトを書いていたんだけど、WSH 依存の部分と ecma 262 の部分を切り分けられないかなーとモゾモゾしていた。PHP で定数が定義済みかどうか調べる defined みたいなやつでオブジェクトが使えるかどうかチェックしたいと思ったのだが、そんなものはないみたい。どうしようと思っていてハタと気がついたのが「例外を catch すりゃいいんじゃねーの?」ってことだった。これに気がついたのが何日か前。
その後 prototype.js を読んで、Try.these() すごいっす!と思って、とりあえず書いたのが上のもの。何をしたいのかというとブラウザ上でも WSH でも Rhino の shell 上でもとにかく何かを出力して改行する。それだけのもの。これで何が嬉しいかっていうと、ロジックのチェックは情報が豊富に取れる Mozilla 系の環境で行い、最終動作を WSH で、という形で動かしやすくなるってこと。
たったこれだけなのに快適さがずいぶん違う。こういうものを(たわいのないものであっても)自分で作ったという喜びが ecmascript の場合は妙に大きい気がする。Ruby の場合は「こんなに便利なメソッドがあったのか!」という喜びが多いが、ecmascript の場合は「たったこれだけなのに(標準の状態に比べて)すげー便利になった!」の方が多い。そんな感じ。
上の書き方がオススメできるかどうかは知りません。例外処理は不慣れなもんで。使いたい人はご自由に。
本当はスクリプト起動時にどれが有効かチェックしてあとは適切なオブジェクトの適切なメソッド呼ぶようにした方がいいんですけど。いいんです、そんな細かいこと。
参考
まぁまだ使ってるんだけどね。@nifty は。