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