Решение упражнения 2.4 из SICP

17 January, 2008 (22:08) | Решения упражнений

Вас не пугает, что практически сразу после введения единственной конструкции для построения всех возможных типов данных, мы показываем, что можно обойтись и без нее, полностью сводя данные к процедурам? Надеюсь, нет.

Итак, мы ввели процедуры (cons x y) и (car z) следующим образом:

(define (cons x y)
  (lambda (m) (m x y)))
(define (car z)
  (z (lambda (p q) p))) 

Покажем, что (car (cons x y)) - это x, воспользовавшись для этого подсказанной подстановочной моделью:

(car (cons x y))
(car (lambda (m) (m x y)))
((lambda (m) (m x y)) (lambda (p q) p))
((lambda (p q) p) x y)
x

По аналогии легко догадаться, что (cdr z) можно определить соответствующим образом:

(define (cdr z)
  (z (lambda (p q) q)))

И действительно несложно показать, что (cdr (cons x y)) - это y вновь с помощью подстановок:

(cdr (cons x y))
(cdr (lambda (m) (m x y)))
((lambda (m) (m x y)) (lambda (p q) q))
((lambda (p q) q) x y)
y

Так есть ли на самом деле разница между процедурами и данными?

Write a comment