Решение упражнения 2.4 из SICP
Вас не пугает, что практически сразу после введения единственной конструкции для построения всех возможных типов данных, мы показываем, что можно обойтись и без нее, полностью сводя данные к процедурам? Надеюсь, нет.
Итак, мы ввели процедуры (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