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

問題を読む。
まー大丈夫そう。


必要な答えは、
1. doubleを定義する
2. (((double (double double)) inc) 5)がどういう値を返すか確かめる。


「1.」でdoubleの定義で迷うところは特になし。lambdaをつかえばいい。


「2.」の答えで、incという手続きも必要なので、それも定義する。
んで、値の予測としては、
二回の二回の二回ということで、(2^2)^2回 incを行うのかなと想定。
そうすると、入力パラメータに16を足して出力する関数が出力されるのかな?


ということで、ソース

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

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

(define (double f)
  (lambda (x)
    (f (f x))))

;; main
(define (main args)

  (display "(inc 1) : ")
  (display (inc 1))
  (newline)

  (display "((double inc) 1) : ")
  (display ((double inc) 1))
  (newline)

  (display "(((double (double double)) inc) 5) : ")
  (display (((double (double double)) inc) 5) )

  (newline)
0)


実行!

(inc 1) : 2
((double inc) 1) : 3
(((double (double double)) inc) 5) : 21


予測もあってたし、今日はゆっくり寝れそうです。