Решение упражнения 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