Rac*_*oob 7 lisp macros common-lisp hygiene racket
在Common Lisp中,创建宏定义宏相对容易.例如,以下宏
(defmacro abbrev (short long)
`(defmacro ,short (&rest args)
`(,',long ,@args)))
Run Code Online (Sandbox Code Playgroud)
是一个宏定义宏,因为它扩展到另一个宏.
如果我们现在放
(abbrev def defun)
Run Code Online (Sandbox Code Playgroud)
在我们的程序中,我们可以编写def
而不是defun
在定义新函数时.当然,abbrev
也可以用于其他事情.例如,之后
(abbrev /. lambda)
Run Code Online (Sandbox Code Playgroud)
我们可以写(/. (x) (+ x 1))
而不是(lambda (x) (+ x 1))
.尼斯.(有关缩写的详细说明,请参阅http://dunsmor.com/lisp/onlisp/onlisp_20.html)
现在,我的问题是:
abbrev
在Racket中编写类似于
宏的内容?)根据球拍指南的这一部分:
(define-syntax-rule (abbrev short long)
(define-syntax-rule (short body (... ...))
(long body (... ...))))
Run Code Online (Sandbox Code Playgroud)
引用上述链接:
它定义中唯一不明显的部分是(......),它"引用"......因此它在生成的宏中起着通常的作用,而不是生成宏.
现在
(abbrev def define)
(abbrev /. lambda)
(def f (/. (x) (+ x 1)))
(f 3)
Run Code Online (Sandbox Code Playgroud)
产量
4
Run Code Online (Sandbox Code Playgroud)
FWIW,它也适用于Guile,所以它不是特定于Racket的东西.
广告1.是的.广告2.您的示例最容易编写
#lang racket
(define-syntax (abbrev stx)
(syntax-case stx ()
[(_ short long)
#'(define-syntax short (make-rename-transformer #'long))]))
(abbrev def define)
(def x 42)
x
Run Code Online (Sandbox Code Playgroud)
上面的例子评估为42.