#lang racket/base

(require "error.rkt")
(provide check-defined-lexical
         check-defined-module)

(define (check-defined-lexical value name desc)
  (when (eq? (letrec ([x x]) x) value)
    (report-undefined name desc)))

(define (check-defined-module thunk name desc)
  (with-handlers ([exn:fail:contract:variable?
                   (λ (_) (report-undefined name desc))])
    (thunk)))

(define (report-undefined name desc)
  (redex-error #f "reference to ~a ~s before its definition" desc name))