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:
Carl Eastlund 2007-06-26 15:41:01 +00:00
parent e9a4d3aeb2
commit 5b67fcbb86
9 changed files with 70 additions and 0 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -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)

View File

@ -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 ...))

View File

@ -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))