diff --git a/conditional-require/conditional-require-test.rkt b/conditional-require/conditional-require-test.rkt new file mode 100644 index 0000000..3ef5270 --- /dev/null +++ b/conditional-require/conditional-require-test.rkt @@ -0,0 +1,28 @@ +#lang racket/base +(module+ test + (require rackunit syntax-parse-example/conditional-require/conditional-require + syntax/macro-testing) + + (conditional-require #true + racket/list + racket/match) + + (check-pred values partition) + + (conditional-require #false + racket/math + racket/flonum) + + (check-pred values flabs) + + (check-exn exn:fail:syntax? + (λ () + (convert-compile-time-error + (conditional-require 1 racket/unsafe/ops typed/racket)))) + + (check-exn exn:fail:syntax? + (λ () + (convert-compile-time-error + (conditional-require #false 1 2)))) + +) diff --git a/conditional-require/conditional-require.rkt b/conditional-require/conditional-require.rkt new file mode 100644 index 0000000..f95f4ae --- /dev/null +++ b/conditional-require/conditional-require.rkt @@ -0,0 +1,15 @@ +#lang racket/base +(provide conditional-require) +(require (for-syntax racket/base syntax/parse)) + +(begin-for-syntax + (define-syntax-class mod-name + (pattern _:id) + (pattern _:string))) + +(define-syntax (conditional-require stx) + (syntax-parse stx + [(_ test:boolean r1:mod-name r2:mod-name) + (if (syntax-e #'test) + #'(require r1) + #'(require r2))])) diff --git a/conditional-require/conditional-require.scrbl b/conditional-require/conditional-require.scrbl new file mode 100644 index 0000000..5247be0 --- /dev/null +++ b/conditional-require/conditional-require.scrbl @@ -0,0 +1,29 @@ +#lang syntax-parse-example +@require[ + (for-label racket/base syntax/parse syntax-parse-example/conditional-require/conditional-require)] + +@(define conditional-require-eval + (make-base-eval '(require syntax-parse-example/conditional-require/conditional-require))) + +@title{@tt{conditional-require}} + +@; ============================================================================= + +This macro conditionally requires one of two module paths based on a compile-time condition. + +@racketfile{conditional-require.rkt} + +Notes: +@itemlist[ +@item{ + The syntax class @racket[mod-name] matches syntactic strings or identifiers. + This doesn't guarantee that the second and third argument to @racket[conditional-require] + are valid module paths, but it rules out nonsense like @racket[(conditional-require #true (+ 2 2) 91)]. +} +@item{ + The test could be more interesting. + It could branch on the value of @racket[current-command-line-arguments], + or do a @racket[case] based on @racket[system-type]. +} +] + diff --git a/index.scrbl b/index.scrbl index a177f3f..4086a59 100644 --- a/index.scrbl +++ b/index.scrbl @@ -20,3 +20,4 @@ @include-example{cross-macro-communication} @include-example{let-star} @include-example{def} +@include-example{conditional-require}