我有一个函数和一个调用该函数的宏。 为了看到不同之处,我追踪了函数,发现它是直接调用还是从宏调用都没有区别。 我想知道为什么从宏调用参数时未被评估。 我知道传递给宏的参数不会被评估,但即使这发生在从宏传递给函数的参数上? 具体而言,我的意思是为什么(< 7 5)传递给GEN-口齿不清当没有评价为零来自宏的函数调用的参数评估
功能:
(defun gen-lisp (expr binds)
expr)
宏:
(defmacro dsptch-prove-query (query binds)
`(if (eq (car ',query) 'lisp)
,(gen-lisp (cadr query) binds)
(prove-query ',query ,binds)))
从宏中调用时的结果:
(dsptch-prove-query (lisp (< 7 5)) nil)
1. Trace: (GEN-LISP '(< 7 5) 'NIL)
1. Trace: GEN-LISP ==> (< 7 5)
NIL
结果时直接调用:
(gen-lisp '(< 7 5) 'NIL)
1. Trace: (GEN-LISP '(< 7 5) 'NIL)
1. Trace: GEN-LISP ==> (< 7 5)
(< 7 5)
如果我只是做了这样的下面,它被评估为零了。
(gen-lisp (< 7 5) nil)
1. Trace: (GEN-LISP 'NIL 'NIL)
1. Trace: GEN-LISP ==> NIL
NIL
我假设一个函数的参数评估是递归的。奇怪的是,从我的角度来看,它只被评估一次。 – user1461328