SICP ex.4.21

気分転換にやってみたけど、あまり面白くなかった。

# ex.4.21.rb
=begin
a.
((lambda (n)
   ((lambda (fact)
      (fact fact n))
    (lambda (ft k)
      (if (= k 1)
          1
          (* k (ft ft (- k 1)))))))
 10)
=end
lambda {|n|
  lambda {|fact|
    fact.call(fact, n)
  }.call lambda {|ft, k|
    if k == 1
      1
    else
      k * ft.call(ft, k - 1)
    end
  }
}.call 10

=begin
b.
(define (f x)
  (define (even? n)
    (if (= n 0)
	#t
	(odd? (- n 1))))
  (define (odd? n)
    (if (= n 0)
	#f
	(even? (- n 1))))
  (even? x))

(define (f x)
  ((lambda (even? odd?)
     (even? even? odd? x))
   (lambda (ev? od? n)
     (if (= n 0) #t (od? ev? od? (- n 1))))
   (lambda (ev? od? n)
     (if (= n 0) #f (ev? ev? od? (- n 1))))
=end
f = lambda {|x|
  lambda {|evenp, oddp|
    evenp.call(evenp, oddp, x)
  }.call lambda {|evp, odp, n|
    if n == 0
      true
    else
      odp.call evp, odp, n - 1
    end
  }, lambda {|evp, odp, n|
    if n == 0
      false
    else
      evp.call evp, odp, n - 1
    end
  }
}

修正

qではなくpだった。predicate