Added binding for .., ..., ...., ....., and ...... in htdp languages.
Uses of these dots expand to an expression generating a runtime error stating "expected a finished expression, but found a placeholder". Students may write and run unfinished templates (as usual), but will get an error message that is more specific and hopefully more useful than unbound variable. Added tests for this functionality. svn: r6743
This commit is contained in:
parent
e9a4d3aeb2
commit
5b67fcbb86
|
@ -26,6 +26,11 @@
|
|||
(rename beginner-and and)
|
||||
(rename beginner-or or)
|
||||
(rename beginner-require require)
|
||||
(rename beginner-dots ..)
|
||||
(rename beginner-dots ...)
|
||||
(rename beginner-dots ....)
|
||||
(rename beginner-dots .....)
|
||||
(rename beginner-dots ......)
|
||||
(rename intermediate-quote quote)
|
||||
(rename intermediate-quasiquote quasiquote)
|
||||
(rename intermediate-unquote unquote)
|
||||
|
|
|
@ -22,6 +22,11 @@
|
|||
(rename beginner-and and)
|
||||
(rename beginner-or or)
|
||||
(rename beginner-require require)
|
||||
(rename beginner-dots ..)
|
||||
(rename beginner-dots ...)
|
||||
(rename beginner-dots ....)
|
||||
(rename beginner-dots .....)
|
||||
(rename beginner-dots ......)
|
||||
;; (rename beginner-contract contract)
|
||||
;; (rename beginner-define-data define-data)
|
||||
(rename intermediate-quote quote)
|
||||
|
|
|
@ -26,6 +26,11 @@
|
|||
(rename beginner-quote quote)
|
||||
(rename beginner-module-begin #%module-begin)
|
||||
(rename beginner-require require)
|
||||
(rename beginner-dots ..)
|
||||
(rename beginner-dots ...)
|
||||
(rename beginner-dots ....)
|
||||
(rename beginner-dots .....)
|
||||
(rename beginner-dots ......)
|
||||
; (rename beginner-contract contract)
|
||||
; (rename beginner-define-data define-data)
|
||||
#%datum
|
||||
|
|
|
@ -23,6 +23,11 @@
|
|||
(rename beginner-and and)
|
||||
(rename beginner-or or)
|
||||
(rename beginner-require require)
|
||||
(rename beginner-dots ..)
|
||||
(rename beginner-dots ...)
|
||||
(rename beginner-dots ....)
|
||||
(rename beginner-dots .....)
|
||||
(rename beginner-dots ......)
|
||||
(rename intermediate-quote quote)
|
||||
(rename intermediate-quasiquote quasiquote)
|
||||
(rename intermediate-unquote unquote)
|
||||
|
|
|
@ -24,6 +24,11 @@
|
|||
(rename beginner-and and)
|
||||
(rename beginner-or or)
|
||||
(rename beginner-require require)
|
||||
(rename beginner-dots ..)
|
||||
(rename beginner-dots ...)
|
||||
(rename beginner-dots ....)
|
||||
(rename beginner-dots .....)
|
||||
(rename beginner-dots ......)
|
||||
(rename intermediate-quote quote)
|
||||
(rename intermediate-quasiquote quasiquote)
|
||||
(rename intermediate-unquote unquote)
|
||||
|
|
|
@ -138,6 +138,7 @@
|
|||
beginner-or
|
||||
beginner-quote
|
||||
beginner-require
|
||||
beginner-dots
|
||||
|
||||
intermediate-define
|
||||
intermediate-define-struct
|
||||
|
@ -1216,6 +1217,28 @@
|
|||
"expected a single module name after `require', but found ~a parts"
|
||||
(length (syntax->list #'rest)))]))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; dots (.. and ... and .... and ..... and ......)
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; Syntax Identifier -> Expression
|
||||
;; Produces an expression which raises an error reporting unfinished code.
|
||||
(define (dots-error stx name)
|
||||
(quasisyntax/loc stx
|
||||
(error (quote (unsyntax name))
|
||||
"expected a finished expression, but found a placeholder")))
|
||||
|
||||
;; Expression -> Expression
|
||||
;; Transforms unfinished code (... and the like) to code
|
||||
;; raising an appropriate error.
|
||||
(define beginner-dots/proc
|
||||
(make-set!-transformer
|
||||
(lambda (stx)
|
||||
(syntax-case stx (set!)
|
||||
[(set! form expr) (dots-error stx (syntax form))]
|
||||
[(form . rest) (dots-error stx (syntax form))]
|
||||
[form (dots-error stx stx)]))))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; local
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
|
@ -215,6 +215,11 @@
|
|||
(eval #'(set! s? 12))
|
||||
(eval #'(set! set-s-x! 12)))
|
||||
|
||||
;; CCE: This tests the error handling for ...
|
||||
;; It should be duplicated for .. through ......
|
||||
;; but (for-each (lambda foo bar) baz) won't work here.
|
||||
(htdp-err/rt-test (set! ... true) "found a placeholder")
|
||||
|
||||
;; ----------------------------------------
|
||||
|
||||
(report-errs)
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
(htdp-test 15 'app-f (f 10))
|
||||
(htdp-top-pop 1)
|
||||
(htdp-top-pop 1)
|
||||
(htdp-top-pop 1)
|
||||
|
||||
(htdp-top (define-struct a0 ()))
|
||||
(htdp-top (define-struct a1 (b)))
|
||||
|
@ -247,3 +248,14 @@
|
|||
(htdp-syntax-test #'(require (lib "a" "b/")) #rx"end with a slash")
|
||||
(htdp-syntax-test #'(require (lib "a" 2)) #rx"string for a lib path")
|
||||
(htdp-syntax-test #'(require (planet "a" 2)) #rx"not a valid planet path")
|
||||
|
||||
(define rx:placeholder "found a placeholder")
|
||||
|
||||
;; CCE: These test the error handling for ...
|
||||
;; They should be duplicated for .. through ......
|
||||
;; but (for-each (lambda foo bar) baz) won't work here.
|
||||
(htdp-err/rt-test ... rx:placeholder)
|
||||
(htdp-err/rt-test (+ 1 ... 2) rx:placeholder)
|
||||
(htdp-err/rt-test (... 1 2) rx:placeholder)
|
||||
(htdp-err/rt-test (if false 1 ...) rx:placeholder)
|
||||
(htdp-test 1 'ok-dots (if true 1 ...))
|
||||
|
|
|
@ -3,3 +3,8 @@
|
|||
|
||||
(htdp-syntax-test #'(define (xthnk) 10))
|
||||
(htdp-syntax-test #'(define xthnk (lambda () 10)))
|
||||
|
||||
;; CCE: This tests the error handling for ...
|
||||
;; It should be duplicated for .. through ......
|
||||
;; but (for-each (lambda foo bar) baz) won't work here.
|
||||
(htdp-error-test #'(set! ... true))
|
||||
|
|
Loading…
Reference in New Issue
Block a user