宏的方案别名

时间:2018-02-03 19:43:00

标签: clojure macros scheme lisp

如何在Scheme中为宏创建别名?

和Clojure一样

define a synonym for a Clojure macro

这是Common Lisp

common lisp function/macro aliases

我意识到它的功能

(define alias function)

但我似乎无法找到或提出如何为宏定义别名(准确地说是在GNU Guile中)

3 个答案:

答案 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)))