puts for ecmascript

以下の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 の場合は「たったこれだけなのに(標準の状態に比べて)すげー便利になった!」の方が多い。そんな感じ。

上の書き方がオススメできるかどうかは知りません。例外処理は不慣れなもんで。使いたい人はご自由に。

本当はスクリプト起動時にどれが有効かチェックしてあとは適切なオブジェクトの適切なメソッド呼ぶようにした方がいいんですけど。いいんです、そんな細かいこと。

参考

More