如何在Scheme中为宏创建别名?
和Clojure一样
define a synonym for a Clojure macro
这是Common Lisp
common lisp function/macro aliases
我意识到它的功能
(define alias function)
但我似乎无法找到或提出如何为宏定义别名(准确地说是在GNU Guile中)
答案 0 :(得分:1)
Guile支持语法规则,因此有一种合理的方法可以创建一个别名,例如`和'看起来像这样:
myViewController
如果你真的想要一个语法别名表格,你可以...... 惊喜! ...将其定义为一个宏:
;; define my-and as an alias for and:
(define-syntax my-and
(syntax-rules ()
[(_ arg ...)
(and arg ...)]))
;; try it out:
(display (my-and #t #t)) (newline)
(display (my-and #t #f)) (newline)
(display (my-and #f (/ 1 0))) (newline)
答案 1 :(得分:1)
在R5RS的便携式Scheme中,您需要创建一个实现它的宏:
(define-syntax test
(syntax-rules ()
((_ . args) (if . args))))
这有点冗长,所以你可以制作一个为你做这个的宏:
(define-syntax define-syntax-alias
(syntax-rules ()
((_ new-name old-name)
(define-syntax new-name
(syntax-rules ()
((_ . args) (old-name . args)))))))
(define-syntax-alias test if)
当然define-syntax-alias
的实现可以放在自己的库中,并在R6RS及以后的任何地方重用。
在一个相关的方言中,Racket以Scheme开始,但现在已经分成了它自己的lisp语言,你会在标准语言中得到类似的东西:
(define-syntax test (make-rename-transformer #'if))
答案 2 :(得分:1)
如果您正在使用支持R6RS的方案实现,例如Chez Scheme或guile,最简单的方法是使用identifier-syntax来创建别名:
(define-syntax new-name (identifier-syntax old-name))
identifier-syntax不仅可以为名称设置别名:它可以为表达式添加别名。因此,您可以按如下方式定义**未指定的**宏:
(define-syntax **unspecified** (identifier-syntax (if #f #f)))