Exercise2-3 <---> Exercise2-5
Exercise 2.4.
Here is an alternative procedural representation of pairs. For this representation, verify that (car (cons x y)) yields x for any objects x and y.
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
What is the corresponding definition of cdr? (Hint: To verify that this works, make use of the substitution model of section 1.1.5.)
Ru: Вот еще одно процедурное представление для пар. Проверьте для этого представления, что при любых двух объектах x и y (car (cons x y)) возвращает x.
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
Каково соответствующее определение cdr? (Подсказка: Чтобы проверить, что это работает, используйте подстановочную модель из раздела 1.1.5.)
Scheme solution:
Let's try to illustrate how (car (cons x y)) works using substitution model. Let x = 1, y = 2, so we evaluate (car (cons 1 2)):
(car (cons 1 2))
= (car (lambda (m) (m 1 2)))
= ((lambda (m) (m 1 2)) (lambda (p q) p))
;; substitute lambda argument instead of m
= ((lambda (p q) p) 1 2)
;; substitute 1 and 2 instead of p and q
;; note that we return the first of two arguments in lambda - p, because we define 'car' now
;; for 'cdr' we should return 'q'
= 1
After this we can easily define cdr:
(define (cdr z)
(z (lambda (p q) q)))
Haskell solution:
cons x y = \m -> m x y
car z = z (\p _ -> p)
cdr z = z (\_ q -> q)
OCaml solution:
let cons x y = fun m -> m x y
let car z = z (fun p _ -> p)
let cdr z = z (fun _ q -> q)
Oberon/Component Pascal solution:
Sorry, no Oberon solutions for this exercise, because of no lambdas in Oberon...
Exercise2-3 <---> Exercise2-5