/racket-5-0-2-bin-i386-osx-mac-dmg/collects/scribble/private/manual-scheme.rkt

http://github.com/smorin/f4f.arc · Racket · 205 lines · 180 code · 23 blank · 2 comment · 15 complexity · f1b6e1a007f54fb78862464868206e76 MD5 · raw file

  1. #lang racket/base
  2. (require "../decode.ss"
  3. "../struct.ss"
  4. "../scheme.ss"
  5. "../search.ss"
  6. "../basic.ss"
  7. racket/list
  8. "manual-utils.ss"
  9. "manual-style.ss"
  10. (for-syntax racket/base)
  11. (for-label racket/base))
  12. (provide racketblock RACKETBLOCK racketblock/form
  13. racketblock0 RACKETBLOCK0 racketblock0/form
  14. racketresultblock racketresultblock0
  15. RACKETRESULTBLOCK RACKETRESULTBLOCK0
  16. racketblockelem
  17. racketinput RACKETINPUT
  18. racketmod
  19. racket RACKET racket/form racketresult racketid
  20. racketmodname
  21. racketmodlink indexed-racket
  22. racketlink
  23. (rename-out [racketblock schemeblock]
  24. [RACKETBLOCK SCHEMEBLOCK]
  25. [racketblock/form schemeblock/form]
  26. [racketblock0 schemeblock0]
  27. [RACKETBLOCK0 SCHEMEBLOCK0]
  28. [racketblock0/form schemeblock0/form]
  29. [racketblockelem schemeblockelem]
  30. [racketinput schemeinput]
  31. [racketmod schememod]
  32. [racket scheme]
  33. [RACKET SCHEME]
  34. [racket/form scheme/form]
  35. [racketresult schemeresult]
  36. [racketid schemeid]
  37. [racketmodname schememodname]
  38. [racketmodlink schememodlink]
  39. [indexed-racket indexed-scheme]
  40. [racketlink schemelink]))
  41. (define-code racketblock0 to-paragraph)
  42. (define-code racketblock (to-paragraph/prefix (hspace 2) (hspace 2) ""))
  43. (define-code RACKETBLOCK (to-paragraph/prefix (hspace 2) (hspace 2) "")
  44. UNSYNTAX)
  45. (define-code RACKETBLOCK0 to-paragraph UNSYNTAX)
  46. (define (to-result-paragraph v)
  47. (to-paragraph v
  48. #:color? #f
  49. #:wrap-elem
  50. (lambda (e) (make-element result-color e))))
  51. (define (to-result-paragraph/prefix a b c)
  52. (let ([to-paragraph (to-paragraph/prefix a b c)])
  53. (lambda (v)
  54. (to-paragraph v
  55. #:color? #f
  56. #:wrap-elem
  57. (lambda (e) (make-element result-color e))))))
  58. (define-code racketresultblock0 to-result-paragraph)
  59. (define-code racketresultblock (to-result-paragraph/prefix (hspace 2) (hspace 2) ""))
  60. (define-code RACKETRESULTBLOCK (to-result-paragraph/prefix (hspace 2) (hspace 2) "")
  61. UNSYNTAX)
  62. (define-code RACKETRESULTBLOCK0 to-result-paragraph UNSYNTAX)
  63. (define interaction-prompt (make-element 'tt (list "> " )))
  64. (define-code racketinput
  65. (to-paragraph/prefix
  66. (make-element #f (list (hspace 2) interaction-prompt))
  67. (hspace 4)
  68. ""))
  69. (define-code RACKETINPUT
  70. (to-paragraph/prefix
  71. (make-element #f (list (hspace 2) interaction-prompt))
  72. (hspace 4)
  73. "")
  74. UNSYNTAX)
  75. (define-syntax (racketmod stx)
  76. (syntax-case stx ()
  77. [(_ #:file filename lang rest ...)
  78. (with-syntax ([modtag (datum->syntax
  79. #'here
  80. `(unsyntax (make-element
  81. #f
  82. (list (hash-lang)
  83. spacer
  84. ,(if (identifier? #'lang)
  85. `(as-modname-link
  86. ',#'lang
  87. (to-element ',#'lang))
  88. #'(racket lang)))))
  89. #'lang)])
  90. (if (syntax-e #'filename)
  91. (quasisyntax/loc stx
  92. (filebox
  93. filename
  94. #,(syntax/loc stx (racketblock0 modtag rest ...))))
  95. (syntax/loc stx (racketblock modtag rest ...))))]
  96. [(_ lang rest ...)
  97. (syntax/loc stx (racketmod #:file #f lang rest ...))]))
  98. (define (to-element/result s)
  99. (make-element result-color (list (to-element/no-color s))))
  100. (define (to-element/id s)
  101. (make-element symbol-color (list (to-element/no-color s))))
  102. (define-syntax (keep-s-expr stx)
  103. (syntax-case stx ()
  104. [(_ ctx s srcloc)
  105. (let ([sv (syntax-e
  106. (syntax-case #'s (quote)
  107. [(quote s) #'s]
  108. [_ #'s]))])
  109. (if (or (number? sv)
  110. (boolean? sv)
  111. (and (pair? sv)
  112. (identifier? (car sv))
  113. (or (free-identifier=? #'cons (car sv))
  114. (free-identifier=? #'list (car sv)))))
  115. ;; We know that the context is irrelvant
  116. #'s
  117. ;; Context may be relevant:
  118. #'(*keep-s-expr s ctx)))]))
  119. (define (*keep-s-expr s ctx)
  120. (if (symbol? s)
  121. (make-just-context s ctx)
  122. s))
  123. (define (add-sq-prop s name val)
  124. (if (eq? name 'paren-shape)
  125. (make-shaped-parens s val)
  126. s))
  127. (define-code racketblockelem to-element)
  128. (define-code racket to-element unsyntax keep-s-expr add-sq-prop)
  129. (define-code RACKET to-element UNSYNTAX keep-s-expr add-sq-prop)
  130. (define-code racketresult to-element/result unsyntax keep-s-expr add-sq-prop)
  131. (define-code racketid to-element/id unsyntax keep-s-expr add-sq-prop)
  132. (define-code *racketmodname to-element unsyntax keep-s-expr add-sq-prop)
  133. (define-syntax racketmodname
  134. (syntax-rules (unsyntax)
  135. [(racketmodname #,n)
  136. (let ([sym n])
  137. (as-modname-link sym (to-element sym)))]
  138. [(racketmodname n)
  139. (as-modname-link 'n (*racketmodname n))]))
  140. (define-syntax racketmodlink
  141. (syntax-rules (unsyntax)
  142. [(racketmodlink n content ...)
  143. (*as-modname-link 'n (elem #:style #f content ...))]))
  144. (define (as-modname-link s e)
  145. (if (symbol? s)
  146. (*as-modname-link s e)
  147. e))
  148. (define (*as-modname-link s e)
  149. (make-link-element module-link-color
  150. (list e)
  151. `(mod-path ,(format "~s" s))))
  152. (define-syntax-rule (indexed-racket x)
  153. (add-racket-index 'x (racket x)))
  154. (define (add-racket-index s e)
  155. (let ([k (cond [(and (pair? s) (eq? (car s) 'quote)) (format "~s" (cadr s))]
  156. [(string? s) s]
  157. [else (format "~s" s)])])
  158. (index* (list k) (list e) e)))
  159. (define-syntax-rule (define-/form id base)
  160. (define-syntax (id stx)
  161. (syntax-case stx ()
  162. [(_ a)
  163. (with-syntax ([ellipses (datum->syntax #'a '(... ...))])
  164. #'(let ([ellipses #f])
  165. (base a)))])))
  166. (define-/form racketblock0/form racketblock0)
  167. (define-/form racketblock/form racketblock)
  168. (define-/form racket/form racket)
  169. (define (*racketlink stx-id id . s)
  170. (let ([content (decode-content s)])
  171. (make-delayed-element
  172. (lambda (r p ri)
  173. (list
  174. (make-link-element
  175. #f
  176. content
  177. (or (find-racket-tag p ri stx-id #f)
  178. `(undef ,(format "--UNDEFINED:~a--" (syntax-e stx-id)))))))
  179. (lambda () content)
  180. (lambda () content))))
  181. (define-syntax-rule (racketlink id . content)
  182. (*racketlink (quote-syntax id) 'id . content))