Hatena::ブログ(Diary)

TAKUYA’s CODE RECORDER このページをアンテナに追加 RSSフィード

2008-03-01

Schemeと比べてみる

|

『始めてのJavaScript』を読みながら、JavaScriptの勉強を進めています。この本は以前にも読んだのですが、その時よくわからなかったのが「関数」のところで、引数が関数だった場合についての理解が曖昧でした。しかし、SICPで似たような概念に触れたことで、このあたりがかなりクリアになりました。SchemeとJavaScriptを同時並行で勉強していくのも面白いのかもと思っています。

試しに、本書のサンプルコードをSchemeで書いてみました。まずは、第一引数と第二引数の数値を、第三引数で渡す手続きに適用する処理です。

function funcObject(x,y,z) {
  alert(z(x,y));
}

funcObject(3, 5, function(x,y) { return x * y });

=> 15
(define (funcObject x y z)
  (z x y))

(funcObject 3 5 (lambda (x y) (* x y)))

=> 15

次は、配列の要素の総和を再帰的な手続きで求める処理です。

var addNumbers = function sumNumbers(numArray, indexVal, resultSum){
	
	if (indexVal == numArray.length) {
		document.writeln("Sum is " + resultSum);
		return;
	}
	
	resultSum += numArray[indexVal];
	
	indexVal++;
	
	return sumNumbers(numArray, indexVal, resultSum);
}

var numArray = [1, 35.4, -14, 44, 0.5];
addNumbers(numArray, 0, 0);

=>66.9
(define (sumNumber numArray indexVal resultSum)
  (if (= indexVal
         (length numArray))
      resultSum
      (sumNumber numArray 
                 (+ indexVal 1)
                 (+ resultSum (list-ref numArray indexVal)))))

(define addNumbers sumNumber)

(define numArray (list 1 35.4 -14 44 0.5))

(addNumbers numArray 0 0)

=>66.9