Реализация ф-ций CONS, CAR, CDR (Sheme,CLisp) - Lisp

Формулировка задачи:

В книге SICP описан алгоритм реализации функций CONS,CAR,CDR на языке Sheme
define (cons x y)
(define (dispatch m)
(cond ((= m 0) x)
((= m 1) y)
(else (error "Аргумент не 0 или 1 -- CONS" m))))
dispatch)
(define (car z) (z 0))
(define (cdr z) (z 1))
Вот как я реализовал в CLisp
(defun cons(x y) 
(defun dispatch (m)
(cond 
((eq m 0) x)
((eq m 1) y)
((and(not (eq m 1))(not(eq m 0))) "Аргумент не 0 или 1")
))
)
(defun car(z)(funcall z 0))
(defun cdr(z)(funcall z 1))
Но, наверное, этот же алгоритм можно реализовать с помощью глобальных переменных defvar Что-то типа этого
(defvar m 0)
(defvar x 0)
(defvar y 0)
(defun dispatch (m)
(cond 
((= m 0) x)
((= m 1) y)
((> m 1) "Arg is not 0 or 1")
))
(defun cons(x y) (dispatch m))
(defun car(z)(funcall z  0))
(defun cdr(z)(funcall z  1))
Но тут что-то не то. Как вызвать dispatch из cons,вызвать cons из car или cdr

Код к задаче: «Реализация ф-ций CONS, CAR, CDR (Sheme,CLisp) - Lisp»

textual
(defn f-cons (x y) 
    lambda (m)
        cond (= m 0) x
             (= m 1) y
             "Аргумент не 0 или 1")

10   голосов, оценка 4.300 из 5


СОХРАНИТЬ ССЫЛКУ