2014-05-18 3 views
0

Dans Guile ou en utilisant SRFI-46, il est possible comme montré dans Specifying a Custom Ellipsis Identifier. Mais est-ce possible dans SISC ou "schéma pur" R5RS?Comment créer une macro qui génère une autre macro dans SISC/Scheme?

Je sais que c'est possible sans ellipse, mais que se passe-t-il si j'ai besoin d'ellipses intérieures comme l'exemple ci-dessous?

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

Répondre

1

L'extension macro utilisé dans SISC, psyntax, soutient une autre façon de faire des ellipses internes, en utilisant la macro .... Vous pouvez écrire en appliquant la ... macro à chaque ellipses interne que vous souhaitez utiliser:

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

ou vous pouvez l'appliquer à une forme extérieure où tous les points de suspension à l'intérieur sont censés être intérieur:

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