Próbuję napisać makro w lisp, które zwraca nth wyrażenie przekazane do niego i tylko ocenia to wyrażenie. Na przykład:Makra Lispa oceniające wyrażenia, gdy nie chcę tego do
(let ((n 2))
(nth-expr n (/ 1 0) (+ 1 2) (/ 1 0)))
powinien wrócić 3. Otrzymuję podział przez błąd 0. Moja definicja makr jest następująca:
(defmacro nth-expr (n &rest expressions)
(let ((i (gensym))
(expr (gensym)))
`(do ((,i 1 (1+ ,i))
(,expr ,expressions (cdr ,expr)))
((= ,i ,n) (car ,expr)))))
Czy mam pojęcie, co robię źle? Dzięki.
EDIT:
Dzięki @Vsevolod Dyomkin za pomoc z powyższej strony. Teraz jest jeszcze jeden problem. Gdy próbuję wykonać
(let ((n 3) (x "win") (y "lose"))
(nth-expr n (princ x) (princ x) (princ y) (princ x)))
Otrzymuję komunikat o błędzie Error: Attempt to take the value of the unbound variable 'Y'
.
mój zaktualizowany kod wygląda następująco:
(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)))))))
Dlaczego wywołujesz 'eval' w makrze? – leppie
@pelpie, ponieważ jeśli nie, zwraca (princ y), ale chcę, aby to było oceniane. – Daniel
"Y" nie istnieje na tym etapie. Co próbujesz zrobić? – leppie