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

Har*_*ier 7 racket

对于经验丰富的命令式程序员来说,只有熟悉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宏的最佳场所.

  • Dybvig的文章为+1.我实际上已经读过它了,它帮助我理解了`syntax-case`宏很多,特别是像`with-syntax`这样的东西. (2认同)

Chr*_*ung 6

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

  • 我刚刚在第8章的案例研究中找到了Ryan Culpepper的论文:"精炼句法糖:支持宏观发展的工具".http://www.ccs.neu.edu/scheme/pubs/dissertation-culpepper.pdf (2认同)