125 lines
4.4 KiB
Racket
125 lines
4.4 KiB
Racket
#lang racket/base
|
|
(require scribble/manual
|
|
scribble/eval
|
|
racket/sandbox)
|
|
|
|
(provide ellipses
|
|
the-eval
|
|
myexamples
|
|
myinteraction)
|
|
|
|
(define ellipses (racket ...))
|
|
|
|
(define (fixup exn)
|
|
(let ([src (ormap values (exn:fail:syntax-exprs exn))])
|
|
(if src
|
|
(make-exn:fail:syntax
|
|
(format "~a at: ~s" (exn-message exn) (syntax->datum src))
|
|
(exn-continuation-marks exn)
|
|
(exn:fail:syntax-exprs exn))
|
|
exn)))
|
|
(define the-eval
|
|
(call-with-trusted-sandbox-configuration
|
|
(lambda ()
|
|
(parameterize ([sandbox-output 'string]
|
|
[sandbox-error-output 'string]
|
|
[sandbox-propagate-breaks #f]
|
|
[sandbox-eval-handlers
|
|
(list #f
|
|
(lambda (thunk)
|
|
(with-handlers ([exn:fail:syntax?
|
|
(lambda (e) (raise (fixup e)))])
|
|
(thunk))))])
|
|
(make-evaluator 'racket/base
|
|
#:requires (let ([mods '(syntax/parse
|
|
syntax/parse/debug
|
|
syntax/parse/experimental/splicing
|
|
syntax/parse/experimental/contract
|
|
syntax/parse/experimental/reflect
|
|
syntax/parse/experimental/specialize
|
|
syntax/parse/experimental/template
|
|
syntax/parse/experimental/eh)])
|
|
`((for-syntax racket/base ,@mods)
|
|
,@mods)))))))
|
|
(the-eval '(error-print-source-location #f))
|
|
|
|
(define-syntax-rule (myexamples e ...)
|
|
(examples #:eval the-eval e ...))
|
|
|
|
(define-syntax-rule (myinteraction e ...)
|
|
(interaction #:eval the-eval e ...))
|
|
|
|
;; ----
|
|
|
|
(define Spattern "single-term pattern")
|
|
(define Lpattern "list pattern")
|
|
(define Hpattern "head pattern")
|
|
(define EHpattern "ellipsis-head pattern")
|
|
(define Apattern "action pattern")
|
|
|
|
(define Spatterns "single-term patterns")
|
|
(define Lpatterns "list patterns")
|
|
(define Hpatterns "head patterns")
|
|
(define EHpatterns "ellipsis-head patterns")
|
|
(define Apatterns "action patterns")
|
|
|
|
(provide Spattern
|
|
Lpattern
|
|
Hpattern
|
|
EHpattern
|
|
Apattern
|
|
Spatterns
|
|
Lpatterns
|
|
Hpatterns
|
|
EHpatterns
|
|
Apatterns)
|
|
|
|
;; ----
|
|
|
|
(define-syntax-rule (defhere id) (defidentifier #'id #:form? #t))
|
|
|
|
(define-syntax ref
|
|
(syntax-rules ()
|
|
[(ref id suffix ...)
|
|
(elemref (list 'pattern-link (list 'id 'suffix ...))
|
|
(racketkeywordfont (symbol->string 'id))
|
|
(superscript (symbol->string 'suffix)) ...
|
|
#:underline? #f)]))
|
|
(define-syntax def
|
|
(syntax-rules ()
|
|
[(def id suffix ...)
|
|
(elemtag (list 'pattern-link (list 'id 'suffix ...))
|
|
(racket id)
|
|
#|(superscript (symbol->string 'suffix)) ...|# )]))
|
|
|
|
(provide defhere
|
|
ref
|
|
def)
|
|
|
|
;; ----
|
|
|
|
(require (for-label racket/base
|
|
racket/contract
|
|
(except-in syntax/parse ...+)
|
|
syntax/parse/debug
|
|
syntax/parse/experimental/contract
|
|
syntax/parse/experimental/splicing
|
|
syntax/parse/experimental/reflect
|
|
syntax/parse/experimental/provide
|
|
syntax/parse/experimental/specialize
|
|
syntax/parse/experimental/template
|
|
syntax/parse/experimental/eh
|
|
"parse-dummy-bindings.rkt"))
|
|
(provide (for-label (all-from-out racket/base)
|
|
(all-from-out racket/contract)
|
|
(all-from-out syntax/parse)
|
|
(all-from-out syntax/parse/debug)
|
|
(all-from-out syntax/parse/experimental/contract)
|
|
(all-from-out syntax/parse/experimental/splicing)
|
|
(all-from-out syntax/parse/experimental/reflect)
|
|
(all-from-out syntax/parse/experimental/provide)
|
|
(all-from-out syntax/parse/experimental/specialize)
|
|
(all-from-out syntax/parse/experimental/template)
|
|
(all-from-out syntax/parse/experimental/eh)
|
|
(all-from-out "parse-dummy-bindings.rkt")))
|