#lang scheme/base

(require
 "pattern.ss"
 (for-syntax
  scheme/base
  "../tools.ss"))
(provide
 meta-pattern)

;; META PATTERNS

;; I've spent quite some time on this already. This is aproblem
;; that's not so intuitive, at least not in my intuition at this
;; moment. I'd like to write this:
;;
;;   (asm-meta-pattern unary (word opcode)
;;     (([movf f 0 0] word) ([opcode f 0 0]))
;;     ((word)              ([opcode 'WREG 0 0])))
;;
;;   (unary (macro)
;;          (1-     decf))
;;
;; to expand to this:
;;
;;   (define-syntax unary
;;     (syntax-rules ()
;;       ((unary namespace (word opcode) ...)
;;        (asm-transforms namespace
;;                        (([movf f 0 0] word) ([opcode f 0 0])) ...
;;                        ((word)              ([opcode 'WREG 0 0])) ...))))
;;



;; The problem here is to insert the ellipsis at the right place. I
;; couldn't do it with syntax-rules, so I'm inserting the ellipsis
;; manually using a fold. Also, this cannot be in pattern-tx.ss
;; because of a dependency on pattern.ss (which depends in turn on
;; pattern-tx.ss)


(define-syntax (meta-pattern stx)
  (syntax-case stx ()
    ((_ name spec  clause ...)
     #`(define-syntax name
         (syntax-rules ()
           ((name namespace spec (... ...))
            (patterns
             namespace
             #,@(foldr
                 (lambda (stx rest)
                   (list* stx #'(... ...) rest))
                 '()
                 (syntax->list #'(clause ...))))))))))
