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

命令式程序员学习Racket宏系统的最佳方法,racket,Racket,对于只熟悉C宏的有经验的命令式程序员来说,学习Racket宏系统的最佳途径是什么。不仅是它的机制(如何?),还包括在哪里和为什么使用它以及说明这一点的示例 应该先学习Scheme(或Lisp)宏吗?我听说《关于Lisp》一书对Lisp宏进行了很好的解释,并提供了使用它们的优秀示例。这是否有用?有一个问题 如果您以前没有处理过任何类型的Lisp宏,我肯定会推荐Scheme宏而不是CL宏。这是因为Scheme宏使用模式匹配,而且更易于阅读 示例(使用Racket的定义语法规则): 这是一个非常简单的

对于只熟悉C宏的有经验的命令式程序员来说,学习Racket宏系统的最佳途径是什么。不仅是它的机制(如何?),还包括在哪里和为什么使用它以及说明这一点的示例

应该先学习Scheme(或Lisp)宏吗?我听说《关于Lisp》一书对Lisp宏进行了很好的解释,并提供了使用它们的优秀示例。这是否有用?

有一个问题

如果您以前没有处理过任何类型的Lisp宏,我肯定会推荐Scheme宏而不是CL宏。这是因为Scheme宏使用模式匹配,而且更易于阅读

示例(使用Racket的
定义语法规则
):

这是一个非常简单的宏,它定义了
let
,即创建相应的lambda,然后应用它。它很容易阅读,也很容易解释它的作用

稍微复杂一点的宏:

(define-syntax let*
  (syntax-rules ()
    ((let* ()
       expr ...)
     (let ()
       expr ...))
    ((let* ((var val) next ...)
       expr ...)
     (let ((var val))
       (let* (next ...)
         expr ...)))))

这定义了嵌套的
let
s中的
let*
,以便按顺序完成绑定。它包括一个基本案例(没有绑定)和一个递归案例。

我相信最好的宏教程仍然是Kent Dybvig的。这并不是专门关于球拍的,但基本上一切都会继续下去,阅读上面提到的Chris将涵盖所有剩余的差异。尽管名称不同,但它涵盖了“卫生”宏和“不卫生”宏

编辑2014年7月:


自从我写了上面这篇文章之后,格雷格·亨德索特(Greg Hendershott)已经写了一篇关于Racket中宏的精彩教程,题目是。现在,这是开始学习Racket宏的最好地方。

你能推荐一些相关书籍吗?我不知道关于书籍,但Racket有一个极好的宏指南:你应该用这个指针更新答案,因为它是对原始问题的更直接的回答……我刚刚找到Ryan Culpeper的论文:“精炼语法糖:支持宏观开发的工具“第8章中的案例研究+Dybvig的文章有1篇。事实上,我不久前读过它,它帮助我理解了
语法case
宏,特别是
和语法
是如何工作的。这个问题是3年前提出的,得到了两个很好的答案。我不明白为什么让它“暂停”是有用的,特别是因为让它“暂停”的人在这方面没有任何经验。这就是我想知道的山姆:-)哈利,你应该投票重新打开这个问题。我只是注意到它关闭了,因为我收到通知说它现在通过了1000次点击。这比我的任何其他问题都重要。我如何呼吁投票重新开放哈利,其他几个人已经投票重新开放了,所以它又开放了。
(define-syntax let*
  (syntax-rules ()
    ((let* ()
       expr ...)
     (let ()
       expr ...))
    ((let* ((var val) next ...)
       expr ...)
     (let ((var val))
       (let* (next ...)
         expr ...)))))