
This adds the option to generate random terms that satisfy judgment-forms and metafunctions. Currently functionality does not include: - patterns/terms using: ellipses, in-hole/hole and relatives, side-conditions, unquotes - define-relation - redex-check integration
89 lines
3.7 KiB
Racket
89 lines
3.7 KiB
Racket
#lang racket/base
|
|
|
|
(require (for-template racket/base "defined-checks.rkt"))
|
|
(provide make-term-fn
|
|
term-fn?
|
|
term-fn-get-id
|
|
term-fn-get-info
|
|
(struct-out term-id)
|
|
|
|
(struct-out judgment-form)
|
|
|
|
(struct-out defined-term)
|
|
defined-term-id?
|
|
defined-check
|
|
not-expression-context
|
|
|
|
metafunc-proc-pict-info
|
|
metafunc-proc-lang
|
|
metafunc-proc-multi-arg?
|
|
metafunc-proc-name
|
|
metafunc-proc-in-dom?
|
|
metafunc-proc-dom-pat
|
|
metafunc-proc-cases
|
|
metafunc-proc-relation?
|
|
metafunc-proc-gen-clauses
|
|
metafunc-proc-lhs-pats
|
|
metafunc-proc?
|
|
make-metafunc-proc
|
|
|
|
make-language-id
|
|
language-id-nts
|
|
pattern-symbols)
|
|
|
|
(define-values (struct-type make-term-fn term-fn? term-fn-get term-fn-set!)
|
|
(make-struct-type 'term-fn #f 2 0))
|
|
(define term-fn-get-id (make-struct-field-accessor term-fn-get 0))
|
|
(define term-fn-get-info (make-struct-field-accessor term-fn-get 1))
|
|
|
|
(define-struct term-id (id depth))
|
|
|
|
(define (transformer-predicate p? stx)
|
|
(and (identifier? stx)
|
|
(cond [(syntax-local-value stx (λ () #f)) => p?]
|
|
[else #f])))
|
|
|
|
(define-struct judgment-form (name mode proc mk-proc lang lws rule-names gen-clauses mk-gen-clauses)
|
|
#:transparent)
|
|
|
|
(define-struct defined-term (value))
|
|
(define (defined-term-id? stx)
|
|
(transformer-predicate defined-term? stx))
|
|
|
|
(define (defined-check id desc #:external [external id])
|
|
(if (eq? (identifier-binding id) 'lexical)
|
|
(quasisyntax/loc external (check-defined-lexical #,id '#,external #,desc))
|
|
(quasisyntax/loc external (check-defined-module (λ () #,id) '#,external #,desc))))
|
|
|
|
(define (not-expression-context stx)
|
|
(when (eq? (syntax-local-context) 'expression)
|
|
(raise-syntax-error #f "not allowed in an expression context" stx)))
|
|
|
|
(define-values (language-id make-language-id language-id? language-id-get language-id-set) (make-struct-type 'language-id #f 2 0 #f '() #f 0))
|
|
|
|
(define (language-id-nts stx id) (language-id-getter stx id 1))
|
|
(define (language-id-getter stx id n)
|
|
(unless (identifier? stx)
|
|
(raise-syntax-error id "expected an identifier defined by define-language" stx))
|
|
(let ([val (syntax-local-value stx (λ () #f))])
|
|
(unless (and (set!-transformer? val)
|
|
(language-id? (set!-transformer-procedure val)))
|
|
(raise-syntax-error id "expected an identifier defined by define-language" stx))
|
|
(language-id-get (set!-transformer-procedure val) n)))
|
|
|
|
(define pattern-symbols '(any number natural integer real string variable
|
|
variable-not-otherwise-mentioned hole symbol))
|
|
|
|
(define-values (struct:metafunc-proc make-metafunc-proc metafunc-proc? metafunc-proc-ref metafunc-proc-set!)
|
|
(make-struct-type 'metafunc-proc #f 11 0 #f null (current-inspector) 0))
|
|
(define metafunc-proc-pict-info (make-struct-field-accessor metafunc-proc-ref 1))
|
|
(define metafunc-proc-lang (make-struct-field-accessor metafunc-proc-ref 2))
|
|
(define metafunc-proc-multi-arg? (make-struct-field-accessor metafunc-proc-ref 3))
|
|
(define metafunc-proc-name (make-struct-field-accessor metafunc-proc-ref 4))
|
|
(define metafunc-proc-in-dom? (make-struct-field-accessor metafunc-proc-ref 5))
|
|
(define metafunc-proc-dom-pat (make-struct-field-accessor metafunc-proc-ref 6))
|
|
(define metafunc-proc-cases (make-struct-field-accessor metafunc-proc-ref 7))
|
|
(define metafunc-proc-relation? (make-struct-field-accessor metafunc-proc-ref 8))
|
|
(define metafunc-proc-gen-clauses (make-struct-field-accessor metafunc-proc-ref 9))
|
|
(define metafunc-proc-lhs-pats (make-struct-field-accessor metafunc-proc-ref 10))
|