On Mon, Jun 20, 2011 at 11:38 PM, Grant Rettke <gret...@acm.org> wrote: > On Mon, Jun 20, 2011 at 10:00 PM, Robby Findler > <ro...@eecs.northwestern.edu> wrote: >> I don't know if there is one already that is a good match for what you >> want, but you can always use prop:exn:srclocs to make a new one. > > Feels like "Adding New Exception Types" oughta have its own section > immediately following "9.2.4 Built-in Exception Types", starting with > the srclocs info.
I'd like to contribute the following example to the docs, right next to the section about that srcloc property. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #lang racket ;; We create a structure that supports the prop:exn:srcloc protocol: ;; It carries with it the location of the syntax that is guilty. (define-struct (exn:fail:he-who-shall-not-be-named exn:fail) (a-srcloc) #:property prop:exn:srclocs (lambda (a-struct) (match a-struct [(struct exn:fail:he-who-shall-not-be-named (msg marks a-srcloc)) (list a-srcloc)]))) ;; We can play with this by creating a form that looks at identifiers, and ;; only flags specific ones. (define-syntax (skeeterize stx) (syntax-case stx () [(_ expr) (cond [(and (identifier? #'expr) (eq? (syntax-e #'expr) 'voldemort)) (quasisyntax/loc stx (raise (make-exn:fail:he-who-shall-not-be-named "oh dear don't say his name" (current-continuation-marks) (srcloc '#,(syntax-source #'expr) '#,(syntax-line #'expr) '#,(syntax-column #'expr) '#,(syntax-position #'expr) '#,(syntax-span #'expr)))))] [else ;; Otherwise, leave the expression alone. #'expr])])) (define (f x) (* (skeeterize x) x)) (define (g voldemort) (* (skeeterize voldemort) voldemort)) ;; Examples: (f 7) (g 7) ;; The error should highlight the use of the one-who-shall-not-be-named ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users