#lang racket (require drracket/private/get-defs racket/gui string-constants) (define (get-definitions/string string #:define-prefix [define-prefix "(define"]) (define text (new text%)) (send text insert (make-object string-snip% string)) (get-definitions define-prefix #f text)) (define-syntax (test-definitions stx) (syntax-case stx () [(_ string ((name start end) ...)) #`(let ([actual (map (match-lambda [(defn _ n s e) (list n s e)]) (get-definitions/string string))] [expected (list (list name start end) ...)]) (unless (equal? actual expected) (eprintf "Test failure at ~a\nActual: ~s\nExpected: ~s\n" #,(format "~a:~a:~a" (syntax-source #'stx) (syntax-line #'stx) (syntax-column #'stx)) actual expected)))])) (test-definitions #< q [(f p) t]) (define-metafunction L [(g p) t]) (define-metafunction/extension f L h : p -> q [(h p) t]) (define-metafunction/extension f L [(i p) t]) (define-metafunction END (("f" 0 48) ("g" 49 84) ("h" 85 145) ("i" 146 193) ((string-constant end-of-buffer-define) 194 214)))