我一直在使用Practical Common Lisp,并且作为练习决定编写一个宏来确定一个数字是否是另一个数字的倍数:
(defmacro multp (value factor)
`(= (rem ,value ,factor) 0))
这样:
(multp 40 10)
评估为真,而
(multp 40 13)
不是
问题是这个宏在某种程度上泄漏了吗?也是这个"好"的Lisp?是否已经存在我可以使用的现有功能/宏?
Siebel给出了可能的泄漏源的广泛破坏(对于简单的情况),这里没有任何泄漏.两者value
和factor
仅按顺序评估一次,并且rem
没有任何副作用.
这不是好Lisp,因为在这种情况下没有理由使用宏.一个功能
(defun multp (value factor) (zerop (rem value factor)))
对于所有实际目的都是相同的.(注意使用zerop
.我认为在这种情况下它会使事情变得更清楚,但是在你需要强调的情况下,如果它是零以外的其他东西,你正在测试的值可能仍然有意义,(= ... 0)
可能会更好)