对于经验丰富的命令式程序员来说,只有熟悉C宏才能学习Racket宏系统的最佳途径是什么.不仅仅是它的机制(如何?),还有使用它的地点和原因以及说明这一点的例子.
应该首先学习Scheme(或Lisp)宏吗?我听说过"On Lisp"这本书对Lisp宏有一个很好的解释,并且有很好的例子.这会有用吗?
Sam*_*adt 12
我相信关于宏的最佳教程仍然是Kent Dybvig的"在Scheme中编写Hygenic宏syntax-case".它并不是专门针对Racket的,但基本上一切都会延续下去,阅读上面提到的Chris 指南将涵盖任何剩余的差异.尽管名称,它涵盖了"hygenic"和"unhygenic"宏.
编辑2014年7月:
自从我写了上面的内容之后,Greg Hendershott在Racket上编写了一篇关于宏的精彩教程,名为Fear of Macros.这是开始学习Racket宏的最佳场所.
如果你以前没有处理任何类型的Lisp宏,我肯定会推荐使用CL宏上的Scheme宏.这是因为Scheme宏使用模式匹配,并且它更容易阅读.
示例(使用Racket define-syntax-rule):
(define-syntax-rule (let ((var val) ...)
expr ...)
((lambda (var ...)
expr ...)
val ...))
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的宏,它定义let了创建相应的lambda,然后应用它.它易于阅读,并且易于推理它的作用.
稍微复杂的宏:
(define-syntax let*
(syntax-rules ()
((let* ()
expr ...)
(let ()
expr ...))
((let* ((var val) next ...)
expr ...)
(let ((var val))
(let* (next ...)
expr ...)))))
Run Code Online (Sandbox Code Playgroud)
这let*根据嵌套lets 定义,以便按顺序完成绑定.它包括一个基本案例(没有绑定),以及一个递归案例.