1.3.1 引数としての手続き

問題 1.31 以降の試験を検討。ええと sum は高階手続きとして書ける、とあるな。例示されてる手続きが以下です。

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

p.31 の記述によれば

手続きを扱う手続きを高階手続き (higher-order procedures) という。

との事。なんか以前の自分エントリを見てみると相当もの凄いナチュラルをぶちカマしている模様。
とりあえず試験は以下かな。カレントディレクトリに product.scm という名前で product の実装が定義されているのが前提。
あと、product の手続きのプロトタイプ (?) は

(define (product term a next b)

とします。

(use gauche.test)
(add-load-path ".")
(load "product")

(define (identity x) x)
(define (inc x) (+ x 1))

(test-start "product")
(test-section "product")
(test* "(product identity 1 inc 5)"
       120
       (product identity 1 inc 5))

(test-end)

pi の近似値云々を product 使って実装って結構アレですな。_与えられた範囲の点_という意味では、factorial の定義は以下なカンジ?

(define (factorial n)
  (product identity 1 inc n))

うーん。与えられた範囲、がリストだったら話早いんだけどな。でもこれって product の実装がナニ。リストだとプロトタイプは以下?

(define (product term next l)

これだと factorial は以下でナニ。

(define (factorial l)
  (product car cdr l))

この問題、pi の近似値なナニの数え上げが微妙。あ、そうでもないのか。分子の方は

(* 2 (product (lambda (x) x) 4 (lambda (x) (+ 2 x)) 100))

って違うな。こうか。

(* 2 (product (lambda (x) (* x x)) 4 (lambda (x) (+ 2 x)) 8))

あ、違う。いやそうでもないか。処理終了時に何を戻すか、なソレで切り分けできますな。引数がもひとつ増えますが。
あと分母が微妙ってか、範囲の指定をどうすりゃ良いのかな。分母はこれで良いのか。

(product (lambda (x) (* x x)) 3 (lambda (x) (+ 2 x)) 8)

実装書きそうになるのでアレですが、なんとなくできそげ。次の 2 つは ad lib で現場でっち上げな方向。(を