[wisp]Clojure構文を使ってJavaScriptを記述する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ClojureでJavascript

最近はCoffeeScriptやDart、TypeScript等、JavaScriptコンパイル言語(変換した結果JavaScriptにする言語)がよく使用されています。
ClojureをJavaScriptへコンパイルする場合、「ClojureScript」がありますが、生成されたJavaScriptは普通に読めるものではありません。
(適当なcljsファイルを作成してコンパイルしてみればわかるはず)

今回紹介する「wisp」は、Clojurescriptと同じくClojureの構文を用いてJavaScriptを生成する言語ですが、
「ちゃんと人が読めるJavaScript」にコンパイルされます。
では、wispをインストールしてつかってみましょう。
また、ここを使用すればwispがClojureをどのようにJavaScriptへ変換するか、確認することができます。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Node.js : v0.10.4
  • npm : 1.2.18

npmを使用してwispモジュールをインストールしましょう。グローバルオプションを使用します。

% mkdir wisp
% cd wisp
% npm install -g wisp

Wispを試してみる

では早速、wispをためしてみましょう。wispコマンドを実行すると、replが起動します。

% wisp
=>

Clojureのreplと同じように、対話形式で構文を記述することができます。

=> (print "hello wisp!")
hello wisp!

関数も定義して使うことができます。

=> (fn add [x y] ( + x y))
=> (add 10 20)
30

ちなみに、fnを使用して関数を定義した場合は単なるfunctionとして変換されます。
defnを使った場合はexportsされ、外部から使うことができるようになります。

//fnを使って定義
=> (fn x[a] ( + a 1))

//このように変換される
function x(a) {
  return a + 1;
};

//defnを使って定義
=> (defn y[b] ( + b 1))

//このように変換される
var y = function y(b) {
  return b + 1;
};
exports.y = y;

wispファイル(Clojure形式で記述したファイル)からjsファイルへ出力しようと思い、wispコマンドのオプションとかを探したんですが、
それらしいものがありませんでした。
どうやら現状はパイプとリダイレクトでjsファイルを出力するようです。(違ってたらおしえてください)

次のようなtest.wispファイルを作成します。

;test.wisp
(fn greet[name] (+  "hello," name))

(print (greet "taro"))

test.wispファイルをjsへ変換しましょう。出力されたjsはそのままnodeで動きます。

% cat test.wisp| wisp > test.js
% cat test.js
function greet(name) {
  return "hello," + name;
};

console.log(greet("taro"))

まとめ

ClojureScriptより綺麗なコードになるし、手軽に使えて便利な気がします。Clojure好きな人はぜひチェックしてみてください。

参考サイトなど