Я пытаюсь написать макрос на lisp, который возвращает переданное в него n-е выражение и оценивает только это выражение. Например:
(let ((n 2))
(nth-expr n (/ 1 0) (+ 1 2) (/ 1 0)))
должен вернуть 3. Я получаю ошибку деления на 0. Мое определение макроса следующее:
(defmacro nth-expr (n &rest expressions)
(let ((i (gensym))
(expr (gensym)))
`(do ((,i 1 (1+ ,i))
(,expr ,expressions (cdr ,expr)))
((= ,i ,n) (car ,expr)))))
Есть идеи, что я делаю не так? Спасибо.
EDIT:
Спасибо @Vsevolod Dyomkin за помощь в выполнении вышеуказанной части. Теперь есть еще одна проблема. Когда я пытаюсь сделать
(let ((n 3) (x "win") (y "lose"))
(nth-expr n (princ x) (princ x) (princ y) (princ x)))
Я получаю ошибку Error: Attempt to take the value of the unbound variable 'Y'
.
Мой обновленный код выглядит так:
(defmacro nth-expr (n &rest expressions)
(let ((i (gensym))
(expr (gensym))
(num (gensym)))
`(let ((,num (eval ,n)))
(do ((,i 1 (1+ ,i))
(,expr ',expressions (cdr ,expr)))
((= ,i ,num) (eval (car ,expr)))))))