racket/collects/redex/private/term-fn.rkt
Robby Findler 4a304643d3 Rackety
2012-03-05 08:12:02 -06:00

41 lines
1.3 KiB
Racket

#lang racket/base
(require (for-template racket/base "defined-checks.rkt"))
(provide make-term-fn
term-fn?
term-fn-get-id
(struct-out term-id)
(struct-out judgment-form)
(struct-out defined-term)
defined-term-id?
defined-check
not-expression-context)
(define-values (struct-type make-term-fn term-fn? term-fn-get term-fn-set!)
(make-struct-type 'term-fn #f 1 0))
(define term-fn-get-id (make-struct-field-accessor term-fn-get 0))
(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))
(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)))