cs: fix error reporting for apply
on a non-list
This commit is contained in:
parent
2d3b426d05
commit
cd596e5277
|
@ -1497,6 +1497,8 @@
|
||||||
(err/rt-test (apply (lambda x x) 1))
|
(err/rt-test (apply (lambda x x) 1))
|
||||||
(err/rt-test (apply (lambda x x) 1 2))
|
(err/rt-test (apply (lambda x x) 1 2))
|
||||||
(err/rt-test (apply (lambda x x) 1 '(2 . 3)))
|
(err/rt-test (apply (lambda x x) 1 '(2 . 3)))
|
||||||
|
(err/rt-test (apply 10 '(2 . 3)))
|
||||||
|
(err/rt-test (apply 10 0 '(2 . 3)))
|
||||||
|
|
||||||
(test '(b e h) map cadr '((a b) (d e) (g h)))
|
(test '(b e h) map cadr '((a b) (d e) (g h)))
|
||||||
(test '(5 7 9) map + '(1 2 3) '(4 5 6))
|
(test '(5 7 9) map + '(1 2 3) '(4 5 6))
|
||||||
|
|
|
@ -42,16 +42,18 @@
|
||||||
[(proc args)
|
[(proc args)
|
||||||
(if (#%procedure? proc)
|
(if (#%procedure? proc)
|
||||||
(#2%apply proc args)
|
(#2%apply proc args)
|
||||||
(#2%apply (extract-procedure proc (length args)) args))]
|
(#2%apply (extract-procedure proc (and (#%list? args) (length args))) args))]
|
||||||
[(proc)
|
[(proc)
|
||||||
(raise-arity-error 'apply (|#%app| arity-at-least 2) proc)]
|
(raise-arity-error 'apply (|#%app| arity-at-least 2) proc)]
|
||||||
[(proc . argss)
|
[(proc . argss)
|
||||||
(if (#%procedure? proc)
|
(if (#%procedure? proc)
|
||||||
(#2%apply #2%apply proc argss)
|
(#2%apply #2%apply proc argss)
|
||||||
(let ([len (let loop ([argss argss])
|
(let ([len (let loop ([argss argss] [accum 0])
|
||||||
(cond
|
(cond
|
||||||
[(null? (cdr argss)) (length (car argss))]
|
[(null? (cdr argss)) (let ([l (car argss)])
|
||||||
[else (fx+ 1 (loop (cdr argss)))]))])
|
(and (#%list? l)
|
||||||
|
(+ accum (length l))))]
|
||||||
|
[else (loop (cdr argss) (fx+ 1 accum))]))])
|
||||||
(#2%apply #2%apply (extract-procedure proc len) argss)))]))
|
(#2%apply #2%apply (extract-procedure proc len) argss)))]))
|
||||||
|
|
||||||
(define-syntax (|#%app| stx)
|
(define-syntax (|#%app| stx)
|
||||||
|
@ -87,7 +89,8 @@
|
||||||
(define (do-extract-procedure f orig-f n-args success-k fail-k)
|
(define (do-extract-procedure f orig-f n-args success-k fail-k)
|
||||||
(cond
|
(cond
|
||||||
[(#%procedure? f)
|
[(#%procedure? f)
|
||||||
(if (chez:procedure-arity-includes? f n-args)
|
(if (or (not n-args)
|
||||||
|
(chez:procedure-arity-includes? f n-args))
|
||||||
(if success-k
|
(if success-k
|
||||||
(success-k f)
|
(success-k f)
|
||||||
f)
|
f)
|
||||||
|
@ -100,7 +103,7 @@
|
||||||
[(fixnum? v)
|
[(fixnum? v)
|
||||||
(let ([a (struct-property-ref prop:procedure-arity rtd #f)])
|
(let ([a (struct-property-ref prop:procedure-arity rtd #f)])
|
||||||
(cond
|
(cond
|
||||||
[(and a (not (bitwise-bit-set? (unsafe-struct*-ref f a) n-args)))
|
[(and a n-args (not (bitwise-bit-set? (unsafe-struct*-ref f a) n-args)))
|
||||||
(wrong-arity-wrapper orig-f)]
|
(wrong-arity-wrapper orig-f)]
|
||||||
[else
|
[else
|
||||||
(do-extract-procedure (unsafe-struct-ref f v) orig-f n-args success-k wrong-arity-wrapper)]))]
|
(do-extract-procedure (unsafe-struct-ref f v) orig-f n-args success-k wrong-arity-wrapper)]))]
|
||||||
|
@ -116,13 +119,13 @@
|
||||||
[else
|
[else
|
||||||
(let ([a (struct-property-ref prop:procedure-arity rtd #f)])
|
(let ([a (struct-property-ref prop:procedure-arity rtd #f)])
|
||||||
(cond
|
(cond
|
||||||
[(and a (not (bitwise-bit-set? (unsafe-struct*-ref f a) n-args)))
|
[(and a n-args (not (bitwise-bit-set? (unsafe-struct*-ref f a) n-args)))
|
||||||
(wrong-arity-wrapper orig-f)]
|
(wrong-arity-wrapper orig-f)]
|
||||||
[else
|
[else
|
||||||
(do-extract-procedure
|
(do-extract-procedure
|
||||||
v
|
v
|
||||||
orig-f
|
orig-f
|
||||||
(fx+ n-args 1)
|
(and n-args (fx+ n-args 1))
|
||||||
(lambda (v)
|
(lambda (v)
|
||||||
(cond
|
(cond
|
||||||
[(not v) (case-lambda)]
|
[(not v) (case-lambda)]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user