为命令式程序员学习Racket Macro系统的最佳方法

时间:2011-11-03 13:06:51

标签: racket

经验丰富的命令式程序员只有熟悉C宏才能学习Racket宏系统的最佳途径是什么。不仅仅是它的机制(如何?),还有使用它的地点和原因以及说明这一点的例子。

首先应该学习Scheme(或Lisp)宏吗?我听说过“On Lisp”这本书对Lisp宏有一个很好的解释,并且有很好的例子。这会有用吗?

2 个答案:

答案 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 documentationexcellent 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,以便按顺序完成绑定。它包括一个基本案例(没有绑定),以及一个递归案例。