ソフトウェアエンジニアのブログ

暇つぶしに書いてます。他に技術的なことは[http://qiita.com/nsas454]に書いてますのでそちらも見てください。

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の方が綺麗に書けて気持ちいいな