// // encoding: Shift_JIS // works on JavaScript / JScript // // if you like... // Object.prototype.car = function() { return this.top() } // Object.prototype.cdr = function() { return this.rest() } // to run on browsers... // function print() { document.writeln(arguments) } // iから始まる自然数の無限リストを作る関数 // ・先頭は、i // ・残りは、i+1 から始まる自然数の列 function numbers(i) { return { top: function(){ return i }, rest: function(){ return numbers(i+1) } } } // 素数の無限リストを作る関数 // ・2以上の自然数の列をエラトステネスの篩にかける function primes() { return eratos( numbers(2) ); } // エラトステネスの篩 // ・先頭の数字はそのまま // ・残りからは、先頭の数の倍数を除いて再度ふるいにかける function eratos( lst ) { return { top: function(){ return lst.top() }, rest: function(){ return eratos(del_mult(lst.top(), lst.rest())) } } } // lstからnの倍数を除いたリストを返す関数 // ・先頭は、先頭がnの倍数だったらもう一個先。でなければそのまま // ・残りは、先頭がnの倍数だったら3番目以降、でなければ2番目以降、からnの倍数を除く function del_mult( n, lst ) { return { top: function(){ return (lst.top()%n==0 ? lst.rest() : lst).top() }, rest: function(){ return del_mult( n, (lst.top()%n==0 ? lst.rest() : lst).rest() ) } } } // 最初の30個を表示してみるテスト。 p = primes(); for(var i=0; i!=30; ++i) { print( p.top() ); p = p.rest(); }