On this page:

15 Macro Testing🔗

 (require syntax/macro-testing) package: base


(phase1-eval ct-expr maybe-quote maybe-catch?)

maybe-quote = 
  | #:quote quote-id
maybe-catch? = 
  | #:catch? catch?
Evaluates ct-expr at compile time and quotes the result using quote-id, which defaults to quote. Another suitable argument for quote-id is quote-syntax.

If catch? is #t, then if the evaluation of ct-expr raises a compile-time exception, it is caught and converted to a run-time exception.

> (struct point (x y))
> (phase1-eval (extract-struct-info (syntax-local-value #'point)))

'(struct:point point point? (point-y point-x) (#f #f) #t)

> (phase1-eval (extract-struct-info (syntax-local-value #'point))
               #:quote quote-syntax)

#<syntax (struct:point point point? (point-y point-x) (#f #f) #t)>

Added in version 6.3 of package base.

Equivalent to (#%expression expr) except if expansion of expr causes a compile-time exception to be raised; in that case, the compile-time exception is converted to a run-time exception raised when the expression is evaluated.

Use convert-compile-time-error to write tests for compile-time error checking like syntax errors:

> (check-exn #rx"missing an \"else\" expression"
             (lambda () (convert-compile-time-error (if 1 2))))
> (check-exn #rx"missing formals and body"
             (lambda () (convert-compile-time-error (lambda))))



name:         check-exn

location:     eval:6:0

params:       '(#rx"missing formals and body" #<procedure>)

message:      "Wrong exception raised"

exn-message:  "eval:6:0: lambda: bad syntax\n  in: (lambda)"


  #(struct:exn:fail:syntax "eval:6:0: lambda: bad syntax\n  in: (lambda)" #<continuation-mark-set> (#<syntax:eval:6:0 (lambda)>))


Without the use of convert-compile-time-error, the checks above would not be executed because the test program would not compile.

Added in version 6.3 of package base.


(convert-syntax-error expr)

Like convert-compile-time-error, but only catches compile-time exn:fail:syntax? exceptions and sets error-print-source-location to #f around the expansion of expr to make the message easier to match exactly.

> (check-exn #rx"^lambda: bad syntax$"
             (lambda () (convert-syntax-error (lambda))))

Added in version 6.3 of package base.