signal error on improper lists passed to map/for-each

This commit is contained in:
Alex Shinn 2021-07-28 17:00:40 +09:00
parent 9710962cd2
commit 18d0adf13b

View file

@ -60,19 +60,27 @@
(define (map1 proc ls res) (define (map1 proc ls res)
(if (pair? ls) (if (pair? ls)
(map1 proc (cdr ls) (cons (proc (car ls)) res)) (map1 proc (cdr ls) (cons (proc (car ls)) res))
(reverse res))) (if (null? ls)
(reverse res)
(error "map: improper list" ls))))
(define (mapn proc lol res) (define (mapn proc lol res)
(if (every pair? lol) (if (every pair? lol)
(mapn proc (mapn proc
(map1 cdr lol '()) (map1 cdr lol '())
(cons (apply proc (map1 car lol '())) res)) (cons (apply proc (map1 car lol '())) res))
(reverse res))) (if (every (lambda (x) (if (null? x) #t (pair? x))) lol)
(reverse res)
(error "map: improper list" ls))))
(if (null? lol) (if (null? lol)
(map1 proc ls '()) (map1 proc ls '())
(mapn proc (cons ls lol) '()))) (mapn proc (cons ls lol) '())))
(define (for-each f ls . lol) (define (for-each f ls . lol)
(define (for1 f ls) (if (pair? ls) (begin (f (car ls)) (for1 f (cdr ls))))) (define (for1 f ls)
(if (pair? ls)
(begin (f (car ls)) (for1 f (cdr ls)))
(if (not (null? ls))
(error "for-each: improper list" ls))))
(if (null? lol) (for1 f ls) (begin (apply map f ls lol) (if #f #f)))) (if (null? lol) (for1 f ls) (begin (apply map f ls lol) (if #f #f))))
(define (any pred ls . lol) (define (any pred ls . lol)