Lisp宏编程:从基础到领域特定语言应用
1. Lisp宏编程基础
1.1 解决重复代码问题
在Lisp编程中,我们常常会遇到代码重复执行的问题,导致意外行为和效率低下。例如, princ 语句的多次出现会使代码变得冗余。为了解决这个问题,我们可以在 split 宏内部创建一个局部变量,示例代码如下:
;Warning! Still contains a bug!
(defmacro split (val yes no)
`(let1 x ,val
(if x
(let ((head (car x))
(tail (cdr x)))
,yes)
,no)))
这个新版本的 split 宏使用了 let1 ,并且可以在其他宏内部使用宏。重新运行之前的示例,我们可以看到 split 宏的行为正确, princ 语句只执行了一次。
1.2 避免变量捕获
然而,这个新版本的 split 宏引入了另一个问题——变量捕获。当我们运行以下代码时:
> (let1 x 100X
(split '(2 3)
(+ x head)
nil))
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



