refactored to reduce stepper dependencies

This commit is contained in:
John Clements 2012-06-19 23:02:54 -07:00
parent 66321c8f84
commit c01e8c1564
29 changed files with 285 additions and 337 deletions

View File

@ -17,7 +17,7 @@
|#
(require (for-syntax "private/clauses-spec-and-process.rkt"
stepper/private/shared)
stepper/private/syntax-property)
"private/define-keywords.rkt"
"private/clauses-spec-aux.rkt"
;; ---

View File

@ -12,7 +12,7 @@
(except-in deinprogramm/signature/signature-syntax property))
(require (for-syntax scheme/base)
(for-syntax stepper/private/shared))
(for-syntax stepper/private/syntax-property))
(require deinprogramm/define-record-procedures)

View File

@ -17,5 +17,5 @@
(require (for-syntax scheme/base)
(for-syntax deinprogramm/syntax-checkers)
(for-syntax stepper/private/shared))
(for-syntax stepper/private/syntax-property))
(include "define-record-procedures.scm")

View File

@ -25,7 +25,6 @@
lang/debugger-language-interface
lang/run-teaching-program
lang/private/continuation-mark-key
stepper/private/shared
(only-in test-engine/scheme-gui make-formatter)
test-engine/scheme-tests

View File

@ -11,7 +11,7 @@
scheme/promise
(for-syntax scheme/base)
(for-syntax syntax/stx)
(for-syntax stepper/private/shared))
(for-syntax stepper/private/syntax-property))
(define-for-syntax (phase-lift stx)
(with-syntax ((?stx stx))

View File

@ -7,7 +7,7 @@
mzlib/struct
(only-in mzlib/list first rest)
(for-syntax scheme/base)
(for-syntax stepper/private/shared))
(for-syntax stepper/private/syntax-property))
(require deinprogramm/signature/signature)

View File

@ -20,7 +20,7 @@
(require scheme/promise
mzlib/struct
(for-syntax scheme/base)
(for-syntax stepper/private/shared))
(for-syntax stepper/private/syntax-property))
(require deinprogramm/quickcheck/quickcheck)

View File

@ -2,9 +2,7 @@
(require mzlib/list
mzlib/contract
(prefix-in mz: mzscheme)
stepper/private/my-macros
stepper/private/shared)
(prefix-in mz: mzscheme))
(define-struct full-mark-struct (module-name source label bindings values))
@ -57,7 +55,7 @@
(define skipto-mark? skipto-mark-struct?)
(define skipto-mark (make-skipto-mark-struct))
(define (strip-skiptos mark-list)
(filter (lx (#%plain-app not (skipto-mark? _))) mark-list))
(filter (lambda (x) (#%plain-app not (skipto-mark? x))) mark-list))
; debug-key: this key will be used as a key for the continuation marks.

View File

@ -32,8 +32,6 @@
"debugger-language-interface.rkt"
"run-teaching-program.rkt"
"htdp-langs-save-file-prefix.rkt"
stepper/private/shared
(only-in test-engine/scheme-gui make-formatter)
(only-in test-engine/scheme-tests

View File

@ -8,7 +8,7 @@
(rename lang/htdp-beginner beginner-app #%app))
(require-for-syntax (prefix fo: "private/firstorder.rkt")
stepper/private/shared)
stepper/private/syntax-property)
(provide define-primitive
define-higher-order-primitive

View File

@ -10,7 +10,7 @@
scheme/promise
(for-syntax scheme/base)
(for-syntax syntax/stx)
(for-syntax stepper/private/shared)
(for-syntax stepper/private/syntax-property)
(for-syntax "firstorder.rkt"))
(define-for-syntax (phase-lift stx)

View File

@ -70,7 +70,7 @@
(only racket/base syntax->datum datum->syntax)
(rename racket/base kw-app #%app)
racket/struct-info
stepper/private/shared
stepper/private/syntax-property
test-engine/racket-tests)
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -1,11 +1,9 @@
(module teachhelp mzscheme
(require "firstorder.rkt"
"rewrite-error-message.rkt"
stepper/private/shared
stepper/private/syntax-property
(for-template (prefix r: racket/base)))
(require-for-syntax stepper/private/shared)
(provide make-undefined-check
make-first-order-function)

View File

@ -2,7 +2,7 @@
(require "stepper-language-interface.rkt"
"debugger-language-interface.rkt"
stepper/private/shared
stepper/private/syntax-property
scheme/class
scheme/contract
test-engine/scheme-tests

View File

@ -1,7 +1,7 @@
#lang racket/base
(require (for-syntax racket/base))
(require (for-syntax stepper/private/shared))
(require (for-syntax racket/base)
(for-syntax stepper/private/syntax-property))
;; ~ = lazy (or delayed)
;; ! = strict (or forced)

View File

@ -174,7 +174,7 @@
;; stepper-syntax-property : like syntax property, but adds properties to an
;; association list associated with the syntax property 'stepper-properties
;; Had to re-define this because of circular dependencies
;; (also defined in stepper/private/shared.rkt)
;; (also defined in stepper/private/syntax-property.rkt)
(define-for-syntax stepper-syntax-property
(case-lambda
[(stx tag)

View File

@ -4,6 +4,7 @@
racket/contract
"marks.rkt"
"shared.rkt"
"syntax-property.rkt"
"my-macros.rkt"
#;"xml-box.rkt"
(prefix-in beginner-defined: "beginner-defined.rkt")

View File

@ -1,8 +1,8 @@
#lang racket
(require (prefix-in kernel: syntax/kerncase)
"testing-shared.rkt"
"shared.rkt"
"syntax-property.rkt"
(for-syntax racket/base))
(define-struct context-record (stx index kind))

View File

@ -2,7 +2,8 @@
(require (only-in syntax/kerncase kernel-syntax-case)
"model-settings.rkt"
"shared.rkt")
"shared.rkt"
"syntax-property.rkt")
(provide/contract [unwind (syntax? render-settings? . -> . syntax?)])
;

View File

@ -4,6 +4,7 @@
mzlib/contract
"my-macros.rkt"
"shared.rkt"
"syntax-property.rkt"
#;(file "/Users/clements/clements/scheme-scraps/eli-debug.ss"))
(define-struct full-mark-struct (source label bindings values))

View File

@ -44,6 +44,7 @@
(prefix-in a: "annotate.rkt")
(prefix-in r: "reconstruct.rkt")
"shared.rkt"
"syntax-property.rkt"
"marks.rkt"
"model-settings.rkt"
"macro-unwind.rkt"

View File

@ -1,11 +1,9 @@
#lang scheme
#lang racket
(require mzlib/class
mred
(require mred
(prefix-in f: framework)
mzlib/pretty
#;"testing-shared.rkt"
"shared.rkt"
racket/pretty
"syntax-property.rkt"
images/compile-time
(for-syntax images/icons/control images/icons/style))

View File

@ -13,6 +13,7 @@
"marks.rkt"
"model-settings.rkt"
"shared.rkt"
"syntax-property.rkt"
"my-macros.rkt"
(for-syntax scheme/base)
racket/private/promise)

View File

@ -1,6 +1,6 @@
#lang racket
(require rackunit)
(require "syntax-property.rkt")
; CONTRACTS
@ -85,16 +85,7 @@
finished-xml-box-table
language-level->name
saved-code-inspector
stepper-syntax-property
with-stepper-syntax-properties
skipto/cdr
skipto/cddr
skipto/first
skipto/second
skipto/third
skipto/fourth
skipto/firstarg
(struct-out annotated-proc)
@ -102,67 +93,6 @@
stepper-frame^
)
;; stepper-syntax-property : like syntax property, but adds properties to an association
;; list associated with the syntax property 'stepper-properties
(define stepper-syntax-property
(case-lambda
[(stx tag)
(unless (member tag known-stepper-syntax-property-names)
(raise-type-error 'stepper-syntax-property "known stepper property symbol" 1 stx tag))
(let ([stepper-props (syntax-property stx 'stepper-properties)])
(if stepper-props
(let ([table-lookup (assq tag stepper-props)])
(if table-lookup
(cadr table-lookup)
#f))
#f))]
[(stx tag new-val)
(unless (member tag known-stepper-syntax-property-names)
(raise-type-error 'stepper-syntax-property "known stepper property symbol" 1
stx tag new-val))
(syntax-property stx 'stepper-properties
(cons (list tag new-val)
(or (syntax-property stx 'stepper-properties)
null)))]))
;; if the given property name isn't in this list, signal an error...
(define known-stepper-syntax-property-names
'(stepper-skip-completely
stepper-hint
stepper-define-type
stepper-xml-hint
stepper-xml-value-hint
stepper-proc-define-name
stepper-orig-name
stepper-prim-name
stepper-binding-type
stepper-no-lifting-info
stepper-and/or-clauses-consumed
stepper-skipto
stepper-skipto/discard
stepper-replace
stepper-else
stepper-black-box-expr
stepper-test-suite-hint
stepper-highlight
stepper-fake-exp
stepper-args-of-call
stepper-hide-completed
stepper-hide-reduction
stepper-use-val-as-final
stepper-lifted-name
lazy-op
))
;; with-stepper-syntax-properties : like stepper-syntax-property, but in a "let"-like form
(define-syntax (with-stepper-syntax-properties stx)
(syntax-case stx ()
[(_ ([property val] ...) body)
(foldl (lambda (property val b) #`(stepper-syntax-property #,b #,property #,val))
#'body
(syntax->list #`(property ...))
(syntax->list #`(val ...)))]))
; A step-result is either:
; (make-before-after-result finished-exps exp redex reduct)
@ -495,14 +425,6 @@
'rebuild)
`(a . (b ((2) c . 3) d))))
;; commonly used values for stepper-syntax-property:
(define skipto/cdr `(syntax-e cdr))
(define skipto/cddr `(syntax-e cdr cdr))
(define skipto/first `(syntax-e car))
(define skipto/second `(syntax-e cdr car))
(define skipto/third `(syntax-e cdr cdr car))
(define skipto/fourth `(syntax-e cdr cdr cdr car))
(define skipto/firstarg (append skipto/cdr skipto/second))
;; skipto/auto : syntax?
;; (symbols 'rebuild 'discard)
@ -517,7 +439,10 @@
(cond [(or (stepper-syntax-property stx 'stepper-skipto)
(stepper-syntax-property stx 'stepper-skipto/discard))
=>
(lambda (x) (update x stx (lambda (y) (skipto/auto y traversal transformer)) traversal))]
(lambda (x) (update x stx
(lambda (y)
(skipto/auto y traversal transformer))
traversal))]
[else (transformer stx)]))
; small test case:
@ -772,10 +697,3 @@
(define-signature view-controller^ (go))
(define-signature stepper-frame^ (stepper-frame%))

View File

@ -0,0 +1,96 @@
#lang racket/base
(require (for-syntax racket/base))
(provide stepper-syntax-property
with-stepper-syntax-properties
skipto/cdr
skipto/cddr
skipto/first
skipto/second
skipto/third
skipto/fourth
skipto/firstarg)
;; stepper-syntax-property : like syntax property, but adds properties to an association
;; list associated with the syntax property 'stepper-properties
(define stepper-syntax-property
(case-lambda
[(stx tag)
(unless (member tag known-stepper-syntax-property-names)
(raise-type-error 'stepper-syntax-property
"known stepper property symbol" 1 stx tag))
(let ([stepper-props (syntax-property stx 'stepper-properties)])
(if stepper-props
(let ([table-lookup (assq tag stepper-props)])
(if table-lookup
(cadr table-lookup)
#f))
#f))]
[(stx tag new-val)
(unless (member tag known-stepper-syntax-property-names)
(raise-type-error 'stepper-syntax-property
"known stepper property symbol" 1
stx tag new-val))
(syntax-property stx 'stepper-properties
(cons (list tag new-val)
(or (syntax-property stx 'stepper-properties)
null)))]))
;; if the given property name isn't in this list, signal an error...
(define known-stepper-syntax-property-names
'(stepper-skip-completely
stepper-hint
stepper-define-type
stepper-xml-hint
stepper-xml-value-hint
stepper-proc-define-name
stepper-orig-name
stepper-prim-name
stepper-binding-type
stepper-no-lifting-info
stepper-and/or-clauses-consumed
stepper-skipto
stepper-skipto/discard
stepper-replace
stepper-else
stepper-black-box-expr
stepper-test-suite-hint
stepper-highlight
stepper-fake-exp
stepper-args-of-call
stepper-hide-completed
stepper-hide-reduction
stepper-use-val-as-final
stepper-lifted-name
lazy-op
))
;; with-stepper-syntax-properties : like stepper-syntax-property,
;; but in a "let"-like form
(define-syntax (with-stepper-syntax-properties stx)
(syntax-case stx ()
[(_ ([property val] ...) body)
(foldl (lambda (property val b)
#`(stepper-syntax-property #,b #,property #,val))
#'body
(syntax->list #`(property ...))
(syntax->list #`(val ...)))]))
;; commonly used values for stepper-syntax-property:
(define skipto/cdr `(syntax-e cdr))
(define skipto/cddr `(syntax-e cdr cdr))
(define skipto/first `(syntax-e car))
(define skipto/second `(syntax-e cdr car))
(define skipto/third `(syntax-e cdr cdr car))
(define skipto/fourth `(syntax-e cdr cdr cdr car))
(define skipto/firstarg (append skipto/cdr skipto/second))

View File

@ -1,62 +0,0 @@
(module testing-shared mzscheme
(require mzlib/contract
"shared.rkt"
syntax/kerncase
mzlib/file)
(provide/contract [build-stx-with-highlight ((or/c (listof any/c) string?) ; input with one or more '(hilite ...) tags
. -> .
(listof syntax?))]) ; result
(define (build-stx-with-highlight input)
(let ([temp-file (make-temporary-file)])
(call-with-output-file temp-file
(lambda (port)
(if (string? input)
(display input port)
(map (lambda (sexp) (write sexp port) (display #\space port)) input)))
'truncate)
(begin0
(let ([file-port (open-input-file temp-file)])
(let read-loop ([stx (read-syntax temp-file file-port)])
(if (eof-object? stx)
null
(cons
(let stx-loop ([stx stx])
(syntax-case stx (hilite)
[(hilite x)
(stepper-syntax-property (stx-loop #`x) 'stepper-highlight #t)]
[(a . rest) (datum->syntax-object stx (cons (stx-loop #`a) (stx-loop #`rest)) stx stx)]
[else stx]))
(read-loop (read-syntax temp-file file-port))))))
(delete-file temp-file))))
; (require tests/utils/mz-testing
; tests/utils/sexp-diff)
; (test `((define a 13) 14 15 #f 1)
; map
; syntax-object->datum
; (build-stx-with-highlight `((define a 13) 14 15 #f 1)))
; (let ([test-run (build-stx-with-highlight `((+ (hilite x) (hilite (+ (hilite 13) (a b))))))])
; (test #t (lambda () (and (pair? test-run) (null? (cdr test-run)))))
; (let ([test-stx (car test-run)])
; (test `(+ x (+ 13 (a b)))
; syntax-object->datum test-stx)
; (test #f stepper-syntax-property test-stx 'stepper-highlight)
; (test #t stepper-syntax-property (car (syntax-e (cdr (syntax-e test-stx)))) 'stepper-highlight)
; (test #t stepper-syntax-property (syntax-case test-stx ()
; [(+ x target)
; #`target])
; 'stepper-highlight)
; (test #t stepper-syntax-property (syntax-case test-stx (#%app)
; [(+ x (a target d))
; #`target])
; 'stepper-highlight)))
;
;
;
; (let ([test-sexp `(+ (hilite x) (hilite (+ (hilite 13) (a b))))])
; (test #t equal? test-sexp (syntax-object->hilite-datum (car (build-stx-with-highlight (list test-sexp))))))
)

View File

@ -1,157 +1,156 @@
(module xml-snip-helpers mzscheme
(require xml/xml
syntax/readerr
mred
mzlib/class
mzlib/list
"shared.rkt")
(provide xml-read-special
xml-snip<%>
scheme-read-special
scheme-snip<%>)
(define (scheme-read-special snip source line col pos)
(let ([text (send snip get-editor)]
[splice? (send snip get-splice?)])
(when (= 0 (send text last-position))
(raise-read-error
(if splice?
"read: bad syntax: empty scheme splice box"
"read: bad syntax: empty scheme box")
source line col pos 1))
(let* ([source-name (get-source-name text)]
[stx (read-syntax source-name
(open-input-text-editor text 0 'end values source-name))])
(when (eof-object? stx)
(raise-read-error
(if splice?
"read: bad syntax: empty scheme splice box"
"read: bad syntax: empty scheme box")
source-name 1 1 1 (send text last-position)))
stx)))
(define (get-source-name text)
#lang racket
(require xml/xml
syntax/readerr
mred
"syntax-property.rkt")
(provide xml-read-special
xml-snip<%>
scheme-read-special
scheme-snip<%>)
(define (scheme-read-special snip source line col pos)
(let ([text (send snip get-editor)]
[splice? (send snip get-splice?)])
(when (= 0 (send text last-position))
(raise-read-error
(if splice?
"read: bad syntax: empty scheme splice box"
"read: bad syntax: empty scheme box")
source line col pos 1))
(let* ([source-name (get-source-name text)]
[stx (read-syntax source-name
(open-input-text-editor text 0 'end values source-name))])
(when (eof-object? stx)
(raise-read-error
(if splice?
"read: bad syntax: empty scheme splice box"
"read: bad syntax: empty scheme box")
source-name 1 1 1 (send text last-position)))
stx)))
(define (get-source-name text)
(cond
[(method-in-interface? 'get-port-name (object-interface text))
(send text get-port-name)]
[else
(send text get-filename)]))
(define (xml-read-special eliminate-whitespace-in-empty-tags? snip source line col pos)
(let ([editor (send snip get-editor)]
[old-locked #f])
(when (= 0 (send editor last-position))
(raise-read-error "read: bad syntax: empty xml box"
source line col pos 1))
(dynamic-wind
(lambda ()
(set! old-locked (send editor is-locked?))
(send editor lock #t))
(lambda ()
(let* ([source-name (get-source-name editor)]
[port (open-input-text-editor editor 0 'end (xml-snip-filter editor) source-name)]
[xml (parameterize ([permissive-xexprs #t]) (read-xml port))]
[xexpr (parameterize ([permissive-xexprs #t]) (xml->xexpr (document-element xml)))]
[clean-xexpr (if eliminate-whitespace-in-empty-tags?
(eliminate-whitespace-in-empty-tags xexpr)
xexpr)]
[expd-xexpr (expand-embedded clean-xexpr)]
[qq-body (datum->syntax #'here expd-xexpr (list editor #f #f #f #f))])
(with-syntax ([qq-body qq-body])
(stepper-syntax-property (syntax (quasiquote qq-body))
'stepper-xml-hint
'from-xml-box))))
(lambda () (send editor lock old-locked)))))
(define ((xml-snip-filter text) s)
(cond
[(is-a? s scheme-snip<%>)
(let* ([position (send text get-snip-position s)]
[line (send text position-paragraph position)]
[col (- position (send text paragraph-start-position line))])
(make-wrapped s text line col position))]
[else s]))
(define scheme-snip<%>
(interface ()
get-splice?))
(define xml-snip<%>
(interface ()))
;; eliminate-whitespace-in-empty-tags : xexpr -> xexpr
(define (eliminate-whitespace-in-empty-tags xexpr)
(cond
[(and (pair? xexpr)
(symbol? (car xexpr)))
(list* (car xexpr)
(cadr xexpr)
(map eliminate-whitespace-in-empty-tags
(eliminate-whitespace-in-list (cddr xexpr))))]
[else xexpr]))
;; wrapped = (make-wraped sexp text number number number)
(define-struct wrapped (snip text line col pos))
;; expand-embedded : xexpr -> xexpr
;; constructs a new xexpr that has the embedded snips expanded
;; and wrapped with unquotes
;; CRUCIAL INVARIANT: an expression must not receive both 'from-xml-box and 'from-scheme/splice-box tags.
(define (expand-embedded _xexpr)
(let loop ([xexpr _xexpr])
(cond
[(method-in-interface? 'get-port-name (object-interface text))
(send text get-port-name)]
[else
(send text get-filename)]))
(define (xml-read-special eliminate-whitespace-in-empty-tags? snip source line col pos)
(let ([editor (send snip get-editor)]
[old-locked #f])
(when (= 0 (send editor last-position))
(raise-read-error "read: bad syntax: empty xml box"
source line col pos 1))
(dynamic-wind
(lambda ()
(set! old-locked (send editor is-locked?))
(send editor lock #t))
(lambda ()
(let* ([source-name (get-source-name editor)]
[port (open-input-text-editor editor 0 'end (xml-snip-filter editor) source-name)]
[xml (parameterize ([permissive-xexprs #t]) (read-xml port))]
[xexpr (parameterize ([permissive-xexprs #t]) (xml->xexpr (document-element xml)))]
[clean-xexpr (if eliminate-whitespace-in-empty-tags?
(eliminate-whitespace-in-empty-tags xexpr)
xexpr)]
[expd-xexpr (expand-embedded clean-xexpr)]
[qq-body (datum->syntax-object #'here expd-xexpr (list editor #f #f #f #f))])
(with-syntax ([qq-body qq-body])
(stepper-syntax-property (syntax (quasiquote qq-body))
'stepper-xml-hint
'from-xml-box))))
(lambda () (send editor lock old-locked)))))
(define ((xml-snip-filter text) s)
[(pair? xexpr)
(cons (loop (car xexpr))
(loop (cdr xexpr)))]
[(wrapped? xexpr)
(let* ([snip (wrapped-snip xexpr)]
[text (wrapped-text xexpr)]
[pos (wrapped-pos xexpr)]
[line (wrapped-line xexpr)]
[col (wrapped-col xexpr)]
[raw-stxs (list (send snip read-special text line col pos))])
(with-syntax ([(stxs ...) raw-stxs])
(if (and (is-a? snip scheme-snip<%>)
(send snip get-splice?))
(with-syntax ([err (syntax/loc
(car (last-pair raw-stxs))
(error 'scheme-splice-box "expected a list, found: ~e" lst))])
#`,@#,(stepper-syntax-property #`(let ([lst (begin stxs ...)])
(if (list? lst)
lst
err))
'stepper-xml-hint
'from-splice-box))
#`,#,(stepper-syntax-property #`(begin stxs ...)
'stepper-xml-hint
'from-scheme-box))))]
[else xexpr])))
;; eliminate-whitespace-in-list (listof xexpr) -> (listof xexpr)
;; if each string in xexprs is a whitespace string, remove all strings
;; otherwise, return input.
(define (eliminate-whitespace-in-list xexprs)
(cond
[(andmap (lambda (x) (or (not (string? x))
(string-whitespace? x)))
xexprs)
(filter (lambda (x) (not (string? x))) xexprs)]
[else xexprs]))
;; string-whitespace? : string -> boolean
;; return #t if the input string consists entirely of whitespace
(define (string-whitespace? str)
(let loop ([i (string-length str)])
(cond
[(is-a? s scheme-snip<%>)
(let* ([position (send text get-snip-position s)]
[line (send text position-paragraph position)]
[col (- position (send text paragraph-start-position line))])
(make-wrapped s text line col position))]
[else s]))
(define scheme-snip<%>
(interface ()
get-splice?))
(define xml-snip<%>
(interface ()))
;; eliminate-whitespace-in-empty-tags : xexpr -> xexpr
(define (eliminate-whitespace-in-empty-tags xexpr)
(cond
[(and (pair? xexpr)
(symbol? (car xexpr)))
(list* (car xexpr)
(cadr xexpr)
(map eliminate-whitespace-in-empty-tags
(eliminate-whitespace-in-list (cddr xexpr))))]
[else xexpr]))
;; wrapped = (make-wraped sexp text number number number)
(define-struct wrapped (snip text line col pos))
;; expand-embedded : xexpr -> xexpr
;; constructs a new xexpr that has the embedded snips expanded
;; and wrapped with unquotes
;; CRUCIAL INVARIANT: an expression must not receive both 'from-xml-box and 'from-scheme/splice-box tags.
(define (expand-embedded _xexpr)
(let loop ([xexpr _xexpr])
(cond
[(pair? xexpr)
(cons (loop (car xexpr))
(loop (cdr xexpr)))]
[(wrapped? xexpr)
(let* ([snip (wrapped-snip xexpr)]
[text (wrapped-text xexpr)]
[pos (wrapped-pos xexpr)]
[line (wrapped-line xexpr)]
[col (wrapped-col xexpr)]
[raw-stxs (list (send snip read-special text line col pos))])
(with-syntax ([(stxs ...) raw-stxs])
(if (and (is-a? snip scheme-snip<%>)
(send snip get-splice?))
(with-syntax ([err (syntax/loc
(car (last-pair raw-stxs))
(error 'scheme-splice-box "expected a list, found: ~e" lst))])
#`,@#,(stepper-syntax-property #`(let ([lst (begin stxs ...)])
(if (list? lst)
lst
err))
'stepper-xml-hint
'from-splice-box))
#`,#,(stepper-syntax-property #`(begin stxs ...)
'stepper-xml-hint
'from-scheme-box))))]
[else xexpr])))
;; eliminate-whitespace-in-list (listof xexpr) -> (listof xexpr)
;; if each string in xexprs is a whitespace string, remove all strings
;; otherwise, return input.
(define (eliminate-whitespace-in-list xexprs)
(cond
[(andmap (lambda (x) (or (not (string? x))
(string-whitespace? x)))
xexprs)
(filter (lambda (x) (not (string? x))) xexprs)]
[else xexprs]))
;; string-whitespace? : string -> boolean
;; return #t if the input string consists entirely of whitespace
(define (string-whitespace? str)
(let loop ([i (string-length str)])
(cond
[(zero? i) #t]
[(char-whitespace? (string-ref str (- i 1)))
(loop (- i 1))]
[else #f])))
;; transformable? : snip -> boolean
;; deteremines if a snip can be expanded here
(define (transformable? snip)
(or (is-a? snip xml-snip<%>)
(is-a? snip scheme-snip<%>))))
[(zero? i) #t]
[(char-whitespace? (string-ref str (- i 1)))
(loop (- i 1))]
[else #f])))
;; transformable? : snip -> boolean
;; deteremines if a snip can be expanded here
(define (transformable? snip)
(or (is-a? snip xml-snip<%>)
(is-a? snip scheme-snip<%>)))

View File

@ -10,7 +10,7 @@
"test-info.scm"
)
(require (for-syntax stepper/private/shared))
(require (for-syntax stepper/private/syntax-property))
(provide
check-expect ;; syntax : (check-expect <expression> <expression>)

View File

@ -1,7 +1,8 @@
#lang racket
(require rackunit
stepper/private/shared)
stepper/private/shared
stepper/private/syntax-property)
; test cases taken from shared.rkt
;