#lang scheme/base
(require
"../tools.ss"
"../ns.ss"
(for-syntax
"../tools.ss"
"../ns-tx.ss"
scheme/base
"static.ss")
scheme/provide-syntax
"../ns.ss")
(provide op-combine-out
define-op-signature
op)
(define-syntax-rule (op name ...) (ns (op name ...)))
(define-provide-syntax op-combine-out
(lambda (stx)
(syntax-case stx ()
((_ name ...)
#`(combine-out
(ns-out (op info) (combine-out name ...)) (ns-out (op ?) (combine-out name ...)) (ns-out (op asm) (combine-out name ...)) (ns-out (op dasm) (combine-out name ...)) )))))
(define-syntax (define-op-signature stx)
(syntax-case stx ()
((_ sig^ (name arg ...) ...)
(let ((static-sig-ids
(for/list ((n (in-stx #'(name ...)))
(a (in-stx #'((arg ...) ...))))
#`(define-syntaxes (#,(ns-prefixed #`(op info) n))
(make-op-static '#,a)))))
#`(begin
(define-signature sig^
(#,@static-sig-ids
#,@(for/list ((n (in-stx #'(name ...))))
(map (lambda (ns) (ns-prefixed ns n))
(list #'(op ?) #'(op asm) #'(op dasm) ))))))))))