Макрос 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)))))

Есть идеи, что я делаю не так? Спасибо.

РЕДАКТИРОВАТЬ:

Спасибо @Vsevolod Dyomkin за помощь мне с вышеупомянутой частью. Теперь есть еще одна проблема. Когда я пытаюсь выполнить

(let ((n 3) (x "win") (y "lose"))
  (nth-expr n (princ x) (princ x) (princ y) (princ x)))

, я получаю сообщение об ошибке Ошибка: попытка получить значение несвязанной переменной «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)))))))
5
задан Daniel 30 November 2011 в 08:40
поделиться