Racket中的宏定义宏?

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)

现在,我的问题是:

  1. 我可以在Racket中编写宏定义宏吗?
  2. 如果可以的话,怎么做?(例如,如何abbrev在Racket中编写类似于 宏的内容?)

use*_*lpa 9

根据球拍指南的这一部分:

(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的东西.


soe*_*ard 5

广告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.