Macros 宏定义球拍中的宏?

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)

在CommonLisp中,创建定义宏的宏相对容易。例如,以下宏

(defmacro abbrev (short long)
  `(defmacro ,short (&rest args)
     `(,',long ,@args)))
是定义宏的宏,因为它扩展到另一个宏

如果我们现在把

(abbrev def defun) 
在我们的程序中,我们可以在定义新函数时编写
def
而不是
defun
。 当然,
abbrev
也可以用于其他用途。比如说,

(abbrev /. lambda)
我们可以写
(/(x)(+x1))
而不是
(lambda(x)(+x1))
。美好的(有关abbrev的详细说明,请参阅)

现在,我的问题是:

  • 我可以在Racket中编写宏定义宏吗
  • 如果可以,怎么做?(例如,如何编写类似于
    abbrev
    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
    
    根据球拍指南的部分内容,上述示例的计算结果为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