diff --git a/collects/lang/private/teach.rkt b/collects/lang/private/teach.rkt index 81a569823e..5da2623994 100644 --- a/collects/lang/private/teach.rkt +++ b/collects/lang/private/teach.rkt @@ -116,13 +116,13 @@ (define-for-syntax (stepper-ignore-checker stx) (stepper-syntax-property stx 'stepper-skipto '(syntax-e cdr syntax-e cdr car))) - (define-for-syntax (map-with-index proc list) - (let loop ([i 0] [list list] [rev-result '()]) - (if (null? list) + (define-for-syntax (map-with-index proc . lists) + (let loop ([i 0] [lists lists] [rev-result '()]) + (if (null? (car lists)) (reverse rev-result) (loop (+ 1 i) - (cdr list) - (cons (proc i (car list)) rev-result))))) + (map cdr lists) + (cons (apply proc i (map car lists)) rev-result))))) ;; build-struct-names is hard to handle (define-for-syntax (make-struct-names name fields stx) @@ -855,16 +855,28 @@ ;; give `check-struct-wraps!' access (make-inspector))) - #,@(map-with-index (lambda (i name) - #`(define (#,name r) - (raw-generic-access r #,i) ; error checking - (check-struct-wraps! r) - (raw-generic-access r #,i))) - getter-names) - #,@(map-with-index (lambda (i name) - #`(define (#,name r v) - (raw-generic-mutate r #,i v))) - setter-names) + #,@(map-with-index (lambda (i name field-name) + #`(define #,name + (let ([raw (make-struct-field-accessor + raw-generic-access + #,i + '#,field-name)]) + (lambda (r) + (raw r) ; error checking + (check-struct-wraps! r) + (raw r))))) + getter-names + fields) + #,@(map-with-index (lambda (i name field-name) + #`(define #,name + (let ([raw (make-struct-field-mutator + raw-generic-mutate + #,i + '#,field-name)]) + (lambda (r v) + (raw r v))))) + setter-names + fields) (define #,predicate-name raw-predicate) (define #,constructor-name raw-constructor) diff --git a/collects/tests/racket/advanced.rktl b/collects/tests/racket/advanced.rktl index 822ef1ed2d..36e25d50bb 100644 --- a/collects/tests/racket/advanced.rktl +++ b/collects/tests/racket/advanced.rktl @@ -285,6 +285,10 @@ (htdp-test #t 'hash-eqv? (hash-eqv? (make-hasheqv (list (list 'a 1))))) +;; Check set...! error message: +(htdp-top (define-struct a1 (b))) +(htdp-err/rt-test (set-a1-b! 1 2) #rx"set-a1-b!") +(htdp-top-pop 1) ;; Simulate set! in the repl (module my-advanced-module (lib "htdp-advanced.rkt" "lang") diff --git a/collects/tests/racket/beg-adv.rktl b/collects/tests/racket/beg-adv.rktl index 00b5247932..21c01720d9 100644 --- a/collects/tests/racket/beg-adv.rktl +++ b/collects/tests/racket/beg-adv.rktl @@ -77,6 +77,7 @@ (htdp-test #t 'a3? (a3? (make-a3 1 2 3))) (htdp-test #f 'a1? (a1? (make-a3 1 2 3))) (htdp-test #f 'a3? (a3? (make-a1 1))) +(htdp-err/rt-test (a1-b 10) #rx"a1-b") (htdp-syntax-test #'cond) (htdp-syntax-test #'(cond))