Skip to content

Commit 7877cc2

Browse files
authored
In stepper, respect the number-display format of the language. (#246)
In stepper, respect the number-display format of the language. To that end, call the underlying pretty-print-print-handler instead of format, and transform write-special'ed number markup into the corresponding snip. Also, add a method to the stepper language to enable the language to provide appropriate pretty-print handlers.
1 parent 7a40f5a commit 7877cc2

File tree

6 files changed

+111
-23
lines changed

6 files changed

+111
-23
lines changed

htdp-lib/lang/htdp-langs.rkt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,12 +726,37 @@
726726
(define (stepper-settings-language %)
727727
(if (implementation? % stepper-language<%>)
728728
(class* % (stepper-language<%>)
729+
(inherit get-abbreviate-cons-as-list
730+
get-use-function-output-syntax?
731+
get-output-function-instead-of-lambda?)
729732
(init-field stepper:supported)
730733
(init-field stepper:enable-let-lifting)
731734
(init-field stepper:show-lambdas-as-lambdas)
732735
(define/override (stepper:supported?) stepper:supported)
733736
(define/override (stepper:enable-let-lifting?) stepper:enable-let-lifting)
734737
(define/override (stepper:show-lambdas-as-lambdas?) stepper:show-lambdas-as-lambdas)
738+
(define/override (stepper:pretty-print-hooks settings previous-size-hook previous-print-hook)
739+
;; avoid mutating the parameters in the current thread
740+
;; (the stepper will typically run in the same thread on subsequent invocations)
741+
(thread-wait
742+
(thread
743+
(lambda ()
744+
(parameterize ((pretty-print-size-hook previous-size-hook)
745+
(pretty-print-print-hook previous-print-hook))
746+
(configure/settings
747+
(sl-runtime-settings (drscheme:language:simple-settings-printing-style settings)
748+
(drscheme:language:simple-settings-fraction-style settings)
749+
(drscheme:language:simple-settings-show-sharing settings)
750+
(drscheme:language:simple-settings-insert-newlines settings)
751+
(htdp-lang-settings-tracing? settings)
752+
(htdp-lang-settings-true/false/empty-as-ids? settings)
753+
(get-abbreviate-cons-as-list)
754+
(get-use-function-output-syntax?)
755+
(get-output-function-instead-of-lambda?)))
756+
(values (pretty-print-size-hook)
757+
(pretty-print-print-hook))))
758+
#:keep 'results)))
759+
735760
(super-new))
736761
(class* % ()
737762
(init stepper:supported)

htdp-lib/lang/private/sl-stepper-button.rkt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,22 @@
4949
(public stepper:show-consumed-and/or-clauses?)
5050
(define (stepper:show-consumed-and/or-clauses?) #t)
5151

52+
(public stepper:pretty-print-hooks)
53+
(define (stepper:pretty-print-hooks settings previous-size-hook previous-print-hook)
54+
;; avoid mutating the parameters in the current thread
55+
;; (the stepper will typically run in the same thread on subsequent invocations)
56+
(thread-wait
57+
(thread
58+
(lambda ()
59+
(parameterize ((pretty-print-size-hook previous-size-hook)
60+
(pretty-print-print-hook previous-print-hook))
61+
(configure/settings settings)
62+
(values (pretty-print-size-hook)
63+
(pretty-print-print-hook))))
64+
#:keep 'results)))
65+
5266
(public stepper:render-to-sexp)
53-
(define (stepper:render-to-sexp val settings language-level)
67+
(define (stepper:render-to-sexp val language-level)
5468
(when (boolean? val)
5569
(log-stepper-debug "render-to-sexp got a boolean: ~v\n" val))
5670
(or (and (procedure? val)
@@ -63,6 +77,3 @@
6377
(print val port)))
6478

6579
(super-instantiate ())))
66-
67-
68-

htdp-lib/lang/stepper-language-interface.rkt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@
1010
stepper:show-lambdas-as-lambdas?
1111
stepper:show-inexactness?
1212
stepper:show-consumed-and/or-clauses?
13+
; takes settings, previous -size-hook and -print-hook as arguments
14+
; returns the language's -size-hook, -print-hook
15+
stepper:pretty-print-hooks
1316
stepper:render-to-sexp)))

htdp-lib/stepper/private/mred-extensions.rkt

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
images/compile-time
88
string-constants
99
pict
10+
simple-tree-text-markup/data
1011
(for-syntax images/icons/control images/icons/style))
1112

1213
(provide
@@ -137,7 +138,10 @@
137138
(define stepper-sub-text%
138139
(class f:text:standard-style-list%
139140

140-
(init-field exps highlight-color show-inexactness? print-boolean-long-form?)
141+
(init-field exps highlight-color
142+
language-pretty-print-size-hook
143+
language-pretty-print-print-hook
144+
show-inexactness? print-boolean-long-form?)
141145

142146
(inherit insert get-style-list set-style-list change-style highlight-range last-position lock erase
143147
begin-edit-sequence end-edit-sequence get-start-position select-all clear)
@@ -178,8 +182,17 @@
178182
(inherit get-dc)
179183

180184
(define/private (format-sexp sexp)
181-
(define text-port (open-output-text-editor this))
182-
185+
(define text-port
186+
(open-output-text-editor this 'end
187+
; need to handle number-markup
188+
(lambda (x)
189+
(if (number-markup? x)
190+
(f:number-snip:number->string/snip (number-markup-number x)
191+
#:exact-prefix (number-markup-exact-prefix x)
192+
#:inexact-prefix (number-markup-inexact-prefix x)
193+
#:fraction-view (number-markup-fraction-view x))
194+
x))))
195+
183196
(parameterize
184197
([pretty-print-show-inexactness show-inexactness?]
185198
[pretty-print-columns pretty-printed-width]
@@ -202,23 +215,31 @@
202215
(let-values ([(xw dc dc2 dc3) (send dc get-text-extent "x")])
203216
(max 1 (inexact->exact (ceiling (/ (unbox wbox) xw))))))]
204217
[(and looked-up (not (eq? looked-up 'non-confusable)))
205-
(string-length (format "~s" (car looked-up)))]
206-
[else #f])))]
218+
(or
219+
; note that this may return #f, but we still want the print-hook to handle it
220+
(language-pretty-print-size-hook (car looked-up) display? port)
221+
(string-length (format "~s" (car looked-up))))]
222+
[else
223+
(language-pretty-print-size-hook value display? port)])))]
207224

208225
[pretty-print-print-hook
209226
; this print-hook is called for confusable highlights and for images.
210227
(lambda (value display? port)
211-
(let ([to-display (cond
212-
[(hash-ref highlight-table value (lambda () #f)) => car]
213-
[else value])])
228+
(let ([looked-up (hash-ref highlight-table value (lambda () #f))])
214229
(cond
215-
[(is-a? to-display snip%)
216-
(write-special (send to-display copy) port) (set-last-style)]
230+
[(is-a? value snip%)
231+
(write-special (send value copy) port) (set-last-style)]
232+
[(and looked-up (not (eq? looked-up 'non-confusable)))
233+
; we have to call the size hook *again* to find
234+
; out if the underlying pretty-print-print-hook
235+
; can handle this
236+
(define to-display (car looked-up))
237+
(if (language-pretty-print-size-hook to-display display? port)
238+
(language-pretty-print-print-hook to-display display? port)
239+
(write-string (format "~s" to-display) port))]
217240
[else
218-
;; there's already code somewhere else to handle this; this seems like a bit of a hack.
219-
(when (and (number? to-display) (inexact? to-display) (pretty-print-show-inexactness))
220-
(write-string "#i" port))
221-
(write-string (format "~s" to-display) port)])))]
241+
(language-pretty-print-print-hook value display? port)])))]
242+
222243
[pretty-print-print-line
223244
(lambda (number port old-length dest-columns)
224245
(when (and number (not (eq? number 0)))
@@ -254,10 +275,14 @@
254275
(select-all)
255276
(clear)
256277
(reset-style)
278+
(define start (get-start-position))
257279
(for ([exp stripped-exps] [i (in-naturals)])
258280
(unless (= i 0)
259281
(insert #\newline))
260282
(format-sexp exp))
283+
(define end (get-start-position))
284+
(change-style (send (get-style-list) find-named-style "Standard")
285+
start end)
261286
(end-edit-sequence)
262287
(lock #t))
263288

@@ -348,7 +373,8 @@
348373
(define stepper-text%
349374
(class f:text:standard-style-list%
350375

351-
(init-field left-side right-side show-inexactness? print-boolean-long-form?)
376+
(init-field left-side right-side show-inexactness? print-boolean-long-form?
377+
language-pretty-print-size-hook language-pretty-print-print-hook)
352378

353379
(inherit find-snip insert change-style highlight-range last-position lock erase auto-wrap
354380
begin-edit-sequence end-edit-sequence get-start-position get-style-list set-style-list
@@ -415,8 +441,11 @@
415441
(make-object stepper-sub-error-text% error-or-exps)]
416442
[else
417443
(make-object stepper-sub-text%
418-
error-or-exps highlight-color show-inexactness?
419-
print-boolean-long-form?)])))
444+
error-or-exps highlight-color
445+
language-pretty-print-size-hook
446+
language-pretty-print-print-hook
447+
show-inexactness?
448+
print-boolean-long-form?)])))
420449

421450
(setup-editor-snip before-snip left-side 'stepper:redex-highlight-color)
422451
(setup-editor-snip after-snip right-side 'stepper:reduct-highlight-color)

htdp-lib/stepper/private/view-controller.rkt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
(require racket/class
1111
racket/match
1212
racket/list
13+
(only-in racket/pretty
14+
pretty-print-size-hook pretty-print-print-hook)
1315
drracket/tool
1416
mred
1517
string-constants
@@ -72,7 +74,7 @@
7274
;; render-to-sexp : TST -> sexp
7375
(define (render-to-sexp val)
7476
(send language-level stepper:render-to-sexp
75-
val simple-settings language-level))
77+
val language-level))
7678

7779
;; channel for incoming views
7880
(define view-channel (make-async-channel))
@@ -353,6 +355,10 @@
353355
(set! disable-runaway-counter #t)
354356
#t]))
355357

358+
(define-values (language-pretty-print-size-hook
359+
language-pretty-print-print-hook)
360+
(send language-level stepper:pretty-print-hooks simple-settings
361+
(pretty-print-size-hook) (pretty-print-print-hook)))
356362

357363
;; translates a result into a step
358364
;; format-result : step-result -> step?
@@ -362,6 +368,8 @@
362368
(Step (new x:stepper-text%
363369
[left-side (map sstx-s pre-exps)]
364370
[right-side (map sstx-s post-exps)]
371+
[language-pretty-print-size-hook language-pretty-print-size-hook]
372+
[language-pretty-print-print-hook language-pretty-print-print-hook]
365373
[show-inexactness?
366374
(send language-level stepper:show-inexactness?)]
367375
[print-boolean-long-form?
@@ -372,6 +380,8 @@
372380
(Step (new x:stepper-text%
373381
[left-side (map sstx-s pre-exps)]
374382
[right-side err-msg]
383+
[language-pretty-print-size-hook language-pretty-print-size-hook]
384+
[language-pretty-print-print-hook language-pretty-print-print-hook]
375385
[show-inexactness?
376386
(send language-level stepper:show-inexactness?)]
377387
[print-boolean-long-form?
@@ -382,6 +392,8 @@
382392
(Step (new x:stepper-text%
383393
[left-side null]
384394
[right-side err-msg]
395+
[language-pretty-print-size-hook language-pretty-print-size-hook]
396+
[language-pretty-print-print-hook language-pretty-print-print-hook]
385397
[show-inexactness?
386398
(send language-level stepper:show-inexactness?)]
387399
[print-boolean-long-form?

htdp-lib/stepper/stepper-tool.rkt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,16 @@
5050
(public stepper:show-consumed-and/or-clauses?)
5151
(define (stepper:show-consumed-and/or-clauses?) #t)
5252

53+
(public stepper:configure-rendering)
54+
(define (stepper:configure-rendering settings)
55+
(error 'stepper:configure-rendering "this must be overridden"))
56+
57+
(public stepper:pretty-print-hooks)
58+
(define (stepper:pretty-print-hooks settings previous-size-hook previous-print-hook)
59+
(error 'stepper:configure-rendering "this must be overridden"))
60+
5361
(public stepper:render-to-sexp)
54-
(define (stepper:render-to-sexp val settings language-level)
62+
(define (stepper:render-to-sexp val language-level)
5563
(when (boolean? val)
5664
(log-stepper-debug "render-to-sexp got a boolean: ~v\n" val))
5765
(or (and (procedure? val)

0 commit comments

Comments
 (0)