Macros 如何在SISC/Scheme中创建生成另一个宏的宏?

Macros 如何在SISC/Scheme中创建生成另一个宏的宏?,macros,scheme,r5rs,guile,srfi,Macros,Scheme,R5rs,Guile,Srfi,在Guile中或使用SRFI-46时,可能会出现如所示的情况。但在SISC或“纯方案”R5R中有可能吗 我知道不使用省略号是可能的,但是如果我需要像下面的例子那样使用内部省略号呢 (define-syntax define-quotation-macros (syntax-rules () ((_ (macro-name head-symbol) ...) (begin (define-syntax macro-name (syntax-rule

在Guile中或使用SRFI-46时,可能会出现如所示的情况。但在SISC或“纯方案”R5R中有可能吗

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

(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 ...)))))
            ...))))