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

时间:2014-05-18 03:21:35

标签: macros scheme r5rs guile srfi

在Guile中或使用SRFI-46,可能如Specifying a Custom Ellipsis Identifier所示。但在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)

1 个答案:

答案 0 :(得分:1)

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