Skip to content

Commit

Permalink
Add pict/code/eval with typeset-interaction, a la scribble/eval
Browse files Browse the repository at this point in the history
  • Loading branch information
lexi-lambda committed Sep 13, 2015
1 parent 15cbc3b commit baec337
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 2 deletions.
1 change: 1 addition & 0 deletions pict-doc/info.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"slideshow-doc"
"draw-lib"
"gui-lib"
"scribble-doc"
"scribble-lib"
"slideshow-lib"
"pict-lib"
Expand Down
44 changes: 43 additions & 1 deletion pict-doc/pict/scribblings/code.scrbl
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
scribble/eval
(for-label (except-in racket only drop)
pict/code
pict/code/eval
pict
racket/gui/base))
racket/gui/base
(only-in scribble/eval make-base-eval)))

@(define stx-obj
(tech #:doc '(lib "scribblings/reference/reference.scrbl") "syntax object"))
Expand All @@ -13,6 +15,7 @@
@(interaction-eval #:eval ss-eval
(begin
(require pict/code
pict/code/eval
pict
(for-syntax racket/base))
(current-code-tt (lambda (s) (text s "monospace" 14)))
Expand Down Expand Up @@ -391,4 +394,43 @@ Mainly for backward compatibility: returns @racket[(if bl-pict

@; ----------------------------------------

@section{Typeseting Evaluation}

@defmodule[pict/code/eval]

@defproc[(typeset-interaction [#:eval eval procedure? (make-base-eval)]
[stx syntax?] ...)
pict?]{

Typesets syntax as Racket code, like @racket[typeset-code], but typesets each
@racket[stx] like an expression in a REPL. Each @racket[stx] is prefixed with
a prompt obtained via @racket[get-current-code-interaction-prompt]. Additionally,
each @racket[stx] is evaluated with @racket[eval], and its result is typeset
in a single color, as determined by @racket[current-result-color].}

@defform[(interaction maybe-eval datum ...)
#:grammar
([maybe-eval (code:line)
(code:line #:eval eval-expr)])]{

The macro form of @racket[typeset-interaction]. Each @racket[datum] will be
evaluated with @racket[eval-expr] and typeset on a separate line.

@(examples
#:eval ss-eval
(interaction
(+ 1 2 3)
(apply string-append '("Hello," " " "world!"))))}

@defparam[get-current-code-interaction-prompt pict (-> pict?)]{

A parameter used to access the pict that should be used as the prompt before each
expression to evaluate in @racket[typeset-interaction].}

@defparam[current-result-color color (or/c string? (is-a?/c color%))]{

A parameter for the color of the results from @racket[typeset-interaction].}

@; ----------------------------------------

@(close-eval ss-eval)
4 changes: 3 additions & 1 deletion pict-lib/info.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
(define deps '("scheme-lib"
"base"
"compatibility-lib"
"draw-lib"))
"draw-lib"
"pict-lib"
"scribble-lib"))
(define build-deps '("rackunit-lib"))

(define pkg-desc "implementation (no documentation) part of \"pict\"")
Expand Down
44 changes: 44 additions & 0 deletions pict-lib/pict/code/eval.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#lang racket/base

(require pict
pict/code
racket/class
racket/contract
racket/draw
(prefix-in scrbl: scribble/eval))

(provide (contract-out
[current-result-color (parameter/c (or/c string? (is-a?/c color%)))]
[get-current-code-interaction-prompt (parameter/c (-> pict?))]
[typeset-interaction ([] [#:eval procedure?] #:rest (listof syntax?) . ->* . pict?)])
interaction)

(define current-result-color
(make-parameter (make-color 0 0 175)))

(define get-current-code-interaction-prompt
(make-parameter (λ () (parameterize ([code-colorize-enabled #f])
(typeset-code #'>)))))

(define (typeset-result datum)
(parameterize ([code-colorize-enabled #f])
(colorize ((current-code-tt) (format "~v" datum)) (current-result-color))))

(define (typeset-evaluation stx #:eval eval)
(let ([typeset-expr (typeset-code stx)]
[result (eval (syntax->datum stx))])
(if (void? result)
(code #,((get-current-code-interaction-prompt)) #,typeset-expr)
(code #,((get-current-code-interaction-prompt)) #,typeset-expr
#,(typeset-result result)))))

(define (typeset-interaction #:eval [eval (scrbl:make-base-eval)] . stxs)
(let ([evaluations (map (λ (stx) (typeset-evaluation stx #:eval eval)) stxs)])
(apply vl-append evaluations)))

(define-syntax interaction
(syntax-rules ()
[(_ #:eval eval expr ...)
(typeset-interaction #:eval eval #'expr ...)]
[(_ expr ...)
(typeset-interaction #'expr ...)]))

0 comments on commit baec337

Please sign in to comment.