#lang scheme (require (for-syntax syntax/parse) "core.ss") (define-syntax (:- stx) (raise-syntax-error ':- "Cannot be used outside define-model" stx)) (define-syntax (paren-stmt->rule stx) (syntax-parse stx #:literals (:-) [(_ (:- head body-query ...+)) (syntax/loc stx (make-rule 'head (list (compile-query body-query) ...)))] [(_ head) (syntax/loc stx (make-rule 'head empty))])) (define-syntax (define-model stx) (syntax-parse stx [(_ model:id paren-stmt ...) (syntax/loc stx (define model (make-model (list (paren-stmt->rule paren-stmt) ...))))])) (define-syntax (query-model stx) (syntax-parse stx [(_ model:expr options ... query) (syntax/loc stx (query-model* model options ... (compile-query query)))])) (provide define-model query-model :- model?)