hyper-literate/scribble-lib/scribble/example.rkt
Matthew Flatt d2bf2e49c5 move scribble/examples to scribble/example
Use singular to follow the naming convention of the style guide.
2015-12-18 06:28:27 -07:00

114 lines
4.1 KiB
Racket

#lang racket/base
(require "eval.rkt"
(only-in "struct.rkt" make-paragraph)
(for-syntax racket/base
syntax/parse))
(provide examples
;; Re-exports:
make-base-eval
make-base-eval-factory
make-eval-factory
close-eval
scribble-exn->string
scribble-eval-handler
make-log-based-eval)
(define example-title
(make-paragraph (list "Example:")))
(define examples-title
(make-paragraph (list "Examples:")))
(define-syntax (examples stx)
(syntax-parse stx
[(_ (~or (~optional (~seq #:eval eval:expr))
(~optional (~and #:once once-kw))
(~optional (~seq #:escape escape:id))
(~optional (~seq #:label title:expr))
(~optional (~and #:no-inset no-inset-kw))
(~optional (~and #:no-prompt no-prompt-kw))
(~optional (~and #:result-only no-form-kw))
(~optional (~and #:no-result block-kw))
(~optional (~and #:hidden no-result-kw))
(~optional (~and #:preserve-source-locations preserve-srclocs-kw))
(~optional (~seq #:lang module-name)))
...
form:expr ...)
(define once? (or (attribute once-kw)
(not (attribute eval))))
(define eval-stx (or (attribute eval) #'(make-base-eval)))
(define base-form
(with-syntax ([eval (if once? #'once-eval eval-stx)]
[escape (or (attribute escape) #'unsyntax)])
(cond
[(attribute block-kw)
(when (attribute module-name)
(raise-syntax-error #f "#:block and #:module are mutually exclusive" stx))
(cond
[(attribute no-inset-kw)
(syntax/loc stx
(racketblock0+eval #:eval eval #:escape escape
form ...))]
[else
(syntax/loc stx
(racketblock+eval #:eval eval #:escape escape
form ...))])]
[(attribute module-name)
(syntax/loc stx
(racketmod+eval #:eval eval #:escape escape module-name
form ...))]
[(attribute no-result-kw)
(syntax/loc stx
(interaction-eval #:eval eval form ...))]
[(attribute no-form-kw)
(syntax/loc stx
(interaction-eval-show #:eval eval form ...))]
[(attribute no-prompt-kw)
(syntax/loc stx
(interaction/no-prompt #:eval eval #:escape escape #:no-errors? #t
form ...))]
[(attribute no-inset-kw)
(syntax/loc stx
(interaction0 #:eval eval #:escape escape #:no-errors? #t
form ...))]
[else
(syntax/loc stx
(interaction #:eval eval #:escape escape #:no-errors? #t
form ...))])))
(define srcloced-form
(cond
[(attribute preserve-srclocs-kw)
(with-syntax ([base-form base-form])
(syntax/loc stx
(with-eval-preserve-source-locations base-form)))]
[else base-form]))
(define examples-form
(cond
[(or (attribute title)
(not (or (attribute block-kw)
(attribute module-name)
(attribute no-result-kw)
(attribute no-form-kw))))
(with-syntax ([srcloced-form srcloced-form]
[title (or (attribute title)
(cond
[(= 1 (length (syntax->list #'(form ...))))
#'example-title]
[else #'examples-title]))])
(syntax/loc stx (as-examples title srcloced-form)))]
[else
srcloced-form]))
(if once?
(with-syntax ([eval eval-stx]
[examples-form examples-form])
(syntax/loc stx
(let ([once-eval eval])
(begin0
examples-form
(close-eval eval)))))
examples-form)]))