#lang scheme/base
(provide sum=0 prod=1 constraints test)
(require
(for-syntax scheme/base
"cpl-prim.ss"
"cpl-net.ss"))
(define-syntax sum=0 rule:sum=0)
(define-syntax prod=1 rule:prod=1)
(define-syntax >0 rule:>0)
(define-syntax (constraints stx)
(syntax-case stx ()
((_ in out tmp (rule . formals) ...)
(let ((inputs (syntax->list #'in))
(outputs (syntax->list #'out))
(internal (syntax->list #'tmp))
(rules (map syntax-local-value (syntax->list #'(rule ...))))
(params (map syntax->list (syntax->list #'(formals ...)))))
(spec->sequence inputs outputs internal rules params)))))
(require scheme/pretty)
(define (test)
(pretty-print
(syntax->datum
(expand-once
#`(constraints
(a b) (c d) (m) (>0 c)
(sum=0 a c)
(prod=1 b d))))))
(test)