JavaScriptでSchemeのcons,car,cdrを実装してみた。
今回、SchemeのconsとcarとcdrをJavaScriptで実装してみました。実装の方法としては、いろんな方法が書けると思いますが、クロージャーを使った実装とプロトタイプを使った実装の2種類を書いてみました。とりあえず参考までにコードを晒しておきます。状況により、エラーチェックも必要でしょうけど、今のところそこまで考慮していません。近いうちに遅延評価についてもJavaScriptで記述してみようと思います。
クロージャーを使った実装方法
consをクロージャーとして実装しています。JavaScriptらしいコードになりましたが、ややオーバースペックな感じが否めません。
function cons(x, y) { return function(m) { return m(x, y); }; } function car(z) { return z(function(p, q){return p;}); } function cdr(z) { return z(function(p, q){return q;}); }
プロトタイプを使った実装方法
cellを作ってからconsするイメージをそのまま使用しています。
通常使う分で、性能を考慮するとクロージャーを使った実装は少しオーバースペックなので、通常はプロトタイプを使った実装の方を利用するようにします。クロージャーを使った実装はどのくらい性能が悪くなるかについては、実験していないので不明です。無責任ですいません。。
function cell(){ this.car = null; this.cdr = null; } function cons(x, y){ var cells = new cell(); cells.car = x; cells.cdr = y; return cells; } function car(x){ return x.car; } function cdr(x){ return x.cdr; }
久しぶりにJavaScript書いてみたらreturnに戸惑ってしまいました。クロージャーなんかは、Schemeの方が綺麗に書けて気持ちいいな