我最近专门为此目的编写了一个 cl 宏,您可能会发现它很有用。它被称为丑陋的小中缀宏。
您可以将有问题的表达式写为:
($ a * ($ 8 * (expt b 2) + 1) + 4 * b * c * ($ 4 * (expt b 2) + 1))
它扩展为
(+ (* A (+ (* 8 (EXPT B 2)) 1)) (* (* (* 4 B) C) (+ (* 4 (EXPT B 2)) 1)))
说明:
$ 是宏的名称。参数被视为表达式列表,因此自由使用空格将数字/形式与表示运算符的符号分开。
考虑以下示例以更好地理解此宏的功能:
($ 1 + 2) ; gets converted to (+ 1 2), where name of the macro is $
($ t and nil) ; gets converted to (and t nil)
($ 3 > 5) ; gets converted to (> 3 5)
($ 1 + 2 + 3) ; gets converted to (+ (+ 1 2) 3)
($ 1 + 2 * 3) ; gets converted to (+ 1 (* 2 3))
($ 1 < 2 and 2 < 3) ; gets converted to (AND (< 1 2) (< 2 3))
操作数位置括号内的任何内容都被视为 lisp 形式。
($ 2 + (max 9 10 11)) ; gets converted to (+ 2 (max 9 10 11)). It could have been any function / lisp form.
($ 6 / ($ 1 + 2)) ; gets converted to (/ 6 ($ 1 + 2)), and then subsequently to (/6 (+ 1 2))
我发现它比 reader 宏更容易推理和更有利,因为它可能很容易与 lisp 形式混合,因此您可以在表达式中嵌套 lisp 形式。例如,(exp b 2)
可以是任何 lisp 形式,如(max a b c)
或您自己的用户定义(foobar a b c)
。
您可以在 github上找到有关README的更多信息。它也可以在 quicklisp 上找到。