Estoy intentando escribir una macro en Lisp que devuelve la expresión enésima pasado a él y sólo evalúa la expresión. Por ejemplo:Lisp expresiones que evalúan macro cuando no lo quieren a
(let ((n 2))
(nth-expr n (/ 1 0) (+ 1 2) (/ 1 0)))
debe devolver 3. Estoy obteniendo un error de división por 0. Mi definición de macro es la siguiente:
(defmacro nth-expr (n &rest expressions)
(let ((i (gensym))
(expr (gensym)))
`(do ((,i 1 (1+ ,i))
(,expr ,expressions (cdr ,expr)))
((= ,i ,n) (car ,expr)))))
¿Alguna idea de lo que estoy haciendo mal? Gracias.
EDIT:
Gracias a @Vsevolod Dyomkin por ayudarme con la parte de arriba. Ahora hay un problema más. Cuando trato de hacer
(let ((n 3) (x "win") (y "lose"))
(nth-expr n (princ x) (princ x) (princ y) (princ x)))
estoy consiguiendo el error Error: Attempt to take the value of the unbound variable 'Y'
.
Mi código actualizado es el siguiente:
(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)))))))
¿Por qué llama 'eval' en una macro? – leppie
@leppie porque si no lo hago, regresa (princ y) pero quiero que eso se evalúe. – Daniel
'Y' no existe en esa etapa. ¿Que estás tratando de hacer? – leppie