如何在SISC / Scheme中创建一个宏来生成另一个宏



在Guile或使用SRFI-46中,可能像指定自定义省略号标识符中所示。但在SISC或"纯方案"R5RS中是否可能?

我知道不使用省略号是可能的,但是如果我需要像下面的例子那样使用内部省略号呢?

(define-syntax define-quotation-macros
  (syntax-rules ()
    ((_ (macro-name head-symbol) ...)
     (begin (define-syntax macro-name
              (syntax-rules ::: ()
                ((_ x :::)
                 (quote (head-symbol x :::)))))
            ...))))
(define-quotation-macros (quote-a a) (quote-b b) (quote-c c))
(quote-a 1 2 3) ⇒ (a 1 2 3)

在SISC中使用的宏扩展器psyntax支持使用...宏的另一种方法来执行内部省略号。您可以将...宏应用于您想要使用的每个内部省略号:

(define-syntax define-quotation-macros
  (syntax-rules ()
    ((_ (macro-name head-symbol) ...)
     (begin (define-syntax macro-name
              (syntax-rules ()
                ((_ x (... ...))
                 '(head-symbol x (... ...)))))
            ...))))

或者你可以将其应用于外部形式,其中所有的椭圆都应该是内部的:

(define-syntax define-quotation-macros
  (syntax-rules ()
    ((_ (macro-name head-symbol) ...)
     (begin (define-syntax macro-name
              (... (syntax-rules ()
                     ((_ x ...)
                      '(head-symbol x ...)))))
            ...))))

相关内容

  • 没有找到相关文章

最新更新