計算機プログラムの構造と解釈 第二版 P44 問題1.43

問題を読む。
これもたいしたことなさそうだ。


要は、指定した回数ある手続きを繰り返して実行してくれる
そんな「手続き」を返す
手続きを作ればいいんだ。


そんで、前の章で作ったcomposeも使わないといけないようなので、
それも考慮に入れる。


んで、こんなかんじだ。

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

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

(define (square x)
  (* x x)) 

(define (compose f g)
  (lambda (x) 
    (f (g x))))

(define (repeated f n)
  (lambda (x) 
    (define (repeated-i value num)
      (cond ((= num 0) value)
            ((>= num 2) (repeated-i ((compose f f) value) (- num 2)))
            (else (repeated-i (f value) (- num 1)))))
    (repeated-i (f x) (- n 1))))


;; main
(define (main args)

  (display "(inc 6) : ")
  (display (inc 6)) 
  (newline)

  (display "(square 7) : ")
  (display (square 7)) 
  (newline)

  (display "((compose square inc) 6) : ")
  (display ((compose square inc) 6)) 
  (newline)

  (display "((repeated square 2) 5) : ")
  (display ((repeated square 2) 5)) 
  (newline)

0)


実行

(inc 6) : 7
(square 7) : 49
((compose square inc) 6) : 49
((repeated square 2) 5) : 625

できてると思う。


追記(2009/04/23)
repeatedの関数だけど、もっといい書き方を思いついたので。書いておきます。

(define (repeated f n)
  (if (<= n 1)
    (lambda (x) 
      (f x)) 
    (repeated (compose f f) (- n 1))))