Macros 宏定义球拍中的宏?
在CommonLisp中,创建定义宏的宏相对容易。例如,以下宏Macros 宏定义球拍中的宏?,macros,lisp,common-lisp,racket,hygiene,Macros,Lisp,Common Lisp,Racket,Hygiene,在CommonLisp中,创建定义宏的宏相对容易。例如,以下宏 (defmacro abbrev (short long) `(defmacro ,short (&rest args) `(,',long ,@args))) 是定义宏的宏,因为它扩展到另一个宏 如果我们现在把 (abbrev def defun) 在我们的程序中,我们可以在定义新函数时编写def而不是defun。 当然,abbrev也可以用于其他用途。比如说, (abbrev /. lambda)
(defmacro abbrev (short long)
`(defmacro ,short (&rest args)
`(,',long ,@args)))
是定义宏的宏,因为它扩展到另一个宏
如果我们现在把
(abbrev def defun)
在我们的程序中,我们可以在定义新函数时编写def
而不是defun
。
当然,abbrev
也可以用于其他用途。比如说,
(abbrev /. lambda)
我们可以写(/(x)(+x1))
而不是(lambda(x)(+x1))
。美好的(有关abbrev的详细说明,请参阅)
现在,我的问题是:
abbrev
Racket中的宏?)#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
根据球拍指南的部分内容,上述示例的计算结果为42。:
(define-syntax-rule (abbrev short long)
(define-syntax-rule (short body (... ...))
(long body (... ...))))
引用上述链接:
其定义中唯一不明显的部分是(……),即
“引用”。。。使其在生成的宏中起到通常的作用,
而不是生成宏
现在
屈服
4
FWIW,它也适用于Guile,因此它不是特定于球拍的东西。我发现重命名可以通过define或let语句简单地完成:
(define =? =)
(define lr list-ref)
或:
输出:
3
#f
#t
为此,似乎不需要任何宏 你颠倒了你的宏参数,long应该是第一位的。我在我的问题中纠正了这一点。坦克!“新”一词在这里造成了混乱(“短”实际上是新术语)。如果在本页的其他地方使用“long”(而不是“new”),则会更清楚。我同意。我已经更改了它。当您要重命名特殊窗体或宏(如
define
或lambda
)时,这不起作用,然后工作的是(define syntax def(make rename transformer#'define))
或(define syntax/(make rename transformer#'lambda))
(let ((=? =)
(lr list-ref))
(println (lr '(1 2 3) 2))
(println (=? 1 2))
(println (=? 1 1)))
3
#f
#t