lispに渡されたn番目の式を返し、その式だけを評価するマクロをlispに書き込もうとしています。例:Lispマクロが欲しないときに式を評価する
(let ((n 2))
(nth-expr n (/ 1 0) (+ 1 2) (/ 1 0)))
3を返す必要があります。エラーで除算しています。私のマクロ定義は次の通りです:
私は間違っていると思いますか?ありがとう。
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'
を得ています。
私の更新されたコードは次のようになります。あなたはこのようなqoute
,expressions
に持って
(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)))))))
マクロで 'eval'を呼び出すのはなぜですか? – leppie
@leppieもし私がしなければ、それは(princ y)を返しますが、私はそれを評価したいと思います。 – Daniel
その段階では「Y」は存在しません。あなたは何をしようとしているのですか? – leppie