#lang at-exp racket/base

(require scribble/struct
         scribble/manual
         scribble/eval
         scribble/decode
         racket/contract
         "../icons.rkt")

(provide (all-from-out scribble/manual)
         (all-from-out scribble/eval)
         (all-from-out racket/contract))

(require (for-label racket))
(provide (for-label (all-from-out racket)))

(provide mz-examples)
(define mz-eval (make-base-eval))
(define-syntax mz-examples
  (syntax-rules ()
    [(_ #:eval . rest)
     (examples #:eval . rest)]
    [(_ . rest)
     (examples #:eval mz-eval . rest)]))

(define AllUnix "Unix and Mac OS X")
(provide AllUnix)

(provide note-lib)
(define-syntax note-lib
  (syntax-rules ()
    [(_ lib #:use-sources (src ...) . more)
     (begin
       (declare-exporting lib racket #:use-sources (src ...))
       (defmodule*/no-declare (lib)
         (t (make-collect-element
             #f null
             (lambda (ci)
               (collect-put! ci `(racket-extra-lib ,'lib) (racketmodname lib))))
            "The bindings documented in this section are provided by the "
            (racketmodname lib)
            " and "
            (racketmodname racket)
            " libraries, but not " (racketmodname racket/base)
            "."
            . more)))]
    [(_ lib . more)
     (note-lib lib #:use-sources () . more)]))

(provide note-init-lib)
(define-syntax note-init-lib
  (syntax-rules ()
    [(_ lib #:use-sources (src ...) . more)
     (begin
       (declare-exporting lib racket/init #:use-sources (src ...))
       (defmodule*/no-declare (lib)
         (t "The bindings documented in this section are provided by the "
            (racketmodname lib)
            " and "
            (racketmodname racket/init)
            " libraries, which means that they are available when "
            " the Racket executable is started with no command-line arguments."
            " They are not provided by " (racketmodname racket/base)
            " or " (racketmodname racket) "."
            . more)))]
    [(_ lib . more)
     (note-init-lib lib #:use-sources () . more)]))

(provide note-lib-only)
(define-syntax note-lib-only
  (syntax-rules ()
    [(_ lib #:use-sources (src ...) . more)
     (defmodule lib #:use-sources (src ...)
       (t "The bindings documented in this section are provided by the "
          (racketmodname lib)
          " library, not " (racketmodname racket/base)
          " or " (racketmodname racket)
          "."
          . more))]
    [(_ lib . more)
     (note-lib-only lib #:use-sources () . more)]))

(define (*exnraise s)
  (make-element #f (list s " exception is raised")))
(define-syntax exnraise
  (syntax-rules ()
    [(_ s) (*exnraise (racket s))]))
(define-syntax Exn
  (syntax-rules ()
    [(_ s) (racket s)]))
(provide exnraise Exn)

(provide margin-note/ref
         refalso moreref Guide guideintro guidealso guidesecref
         raco-doc)

(define (margin-note/ref . s)
  (apply margin-note
         (decode-content (cons magnify s))))

(define (refalso tag . s)
  (apply margin-note
         (decode-content (append (list magnify (secref tag) " also provides information on ")
                                 s
                                 (list ".")))))

(define (moreref tag . s)
  (apply margin-note
         (decode-content (append (list magnify (secref tag) " provides more information on ")
                                 s
                                 (list ".")))))

(define (guidesecref s)
  (secref #:doc '(lib "scribblings/guide/guide.scrbl") s))

(define (guideintro tag . s)
  (apply margin-note
         (decode-content (append (list finger (guidesecref tag) " in " Guide " introduces ")
                                 s
                                 (list ".")))))

(define (guidealso tag)
  (apply margin-note
         (decode-content (append (list finger "See also " (guidesecref tag) " in " Guide ".")))))

(define Guide
  (other-manual '(lib "scribblings/guide/guide.scrbl")))

(define raco-doc
  '(lib "scribblings/raco/raco.scrbl"))

(provide see-read-print)
(define (see-read-print tag-part #:print [print-tag-part tag-part] vals)
  @elem{See @secref[(string-append "parse-" tag-part)]
            for information on @racket[read]ing
            @|vals| and @secref[(string-append "print-" print-tag-part)]
            for information on @racket[print]ing @|vals|.})

(provide speed)
(define-syntax speed
  (syntax-rules ()
    [(_ id what)
     (t "An " (racket id) " application can provide better performance for "
        (elem what)
        " iteration when it appears directly in a " (racket for) " clause.")]))
