diff --git a/csp/csp/expander.rkt b/csp/csp/expander.rkt new file mode 100644 index 00000000..2d9f33f7 --- /dev/null +++ b/csp/csp/expander.rkt @@ -0,0 +1,29 @@ +#lang br/quicklang +(require csp racket/stxparam racket/splicing) +(provide (all-defined-out) + (except-out (all-from-out br/quicklang) #%module-begin) + (rename-out [mb #%module-begin])) + +(define-syntax-parameter PROB (λ (stx) (error 'not-parameterized))) +(define-syntax-parameter SOLVE (make-rename-transformer #'solve)) + +(define-macro (mb EXPR0 ... #:output ID EXPR ...) + (with-syntax ([prob #'ID]) + #'(#%module-begin + (require csp) + (provide prob SOLVE) + (define prob (make-csp)) + (println prob) + (splicing-syntax-parameterize ([PROB (make-rename-transformer #'ID)]) + EXPR0 ... + EXPR ...)))) + +(define-macro (define-variable VID DOMAIN) + #'(begin + (define VID DOMAIN) + (add-var! PROB 'VID DOMAIN))) + +(define-macro (define-constraint CID FUNC VARSYMS) + #'(begin + (define CID (constraint FUNC VARSYMS)) + (add-constraint! PROB FUNC VARSYMS))) \ No newline at end of file diff --git a/csp/csp/main.rkt b/csp/csp/main.rkt index 334cb23a..374aaafe 100644 --- a/csp/csp/main.rkt +++ b/csp/csp/main.rkt @@ -1,4 +1,8 @@ #lang racket/base (require "hacs.rkt") + +(module reader syntax/module-reader + csp/expander) + (provide (all-from-out "hacs.rkt")) diff --git a/csp/csp/test-lang.rkt b/csp/csp/test-lang.rkt new file mode 100644 index 00000000..29dee7d7 --- /dev/null +++ b/csp/csp/test-lang.rkt @@ -0,0 +1,14 @@ +#lang csp +(require csp racket/list) + +#:output foo + +(define-variable q (range 33)) + +foo + +(define-variable n (range 33)) + +(define-constraint c (λ (q n) (= (+ q n) 33)) '(q n)) + +(solve foo) \ No newline at end of file