Provides a native version of for-each that is tail recursive, rather
than having it just use map and discard the return value.
Signed-off-by: Keith Packard <keithp@keithp.com>
(unless #f (write 'unless))
(define (reverse list)
(unless #f (write 'unless))
(define (reverse list)
- (let ((result ()))
- (while (not (null? list))
- (set! result (cons (car list) result))
- (set! list (cdr list))
- )
- result)
+ (define (_r old new)
+ (if (null? old)
+ new
+ (_r (cdr old) (cons (car old) new))
+ )
+ )
+ (_r list ())
(define map
(lambda (proc . lists)
(define map
(lambda (proc . lists)
(cond ((null? lists) ())
(else
(cond ((null? lists) ())
(else
- (cons (caar lists) (args (cdr lists)))
+ (cons (caar lists) (_a (cdr lists)))
(cond ((null? lists) ())
(else
(cond ((null? lists) ())
(else
- (cons (cdr (car lists)) (next (cdr lists)))
+ (cons (cdr (car lists)) (_n (cdr lists)))
(cond ((null? (car lists)) ())
(else
(cond ((null? (car lists)) ())
(else
- (cons (apply proc (args lists)) (domap (next lists)))
+ (cons (apply proc (_a lists)) (_m (_n lists)))
)
)
(map cadr '((a b) (d e) (g h)))
)
)
(map cadr '((a b) (d e) (g h)))
-(define for-each (lambda (proc . lists)
- (apply map proc lists)
- #t))
+(define for-each
+ (lambda (proc . lists)
+ (define (_f lists)
+ (cond ((null? (car lists)) #t)
+ (else
+ (apply proc (map car lists))
+ (_f (map cdr lists))
+ )
+ )
+ )
+ (_f lists)
+ )
+ )
(for-each display '("hello" " " "world" "\n"))
(for-each display '("hello" " " "world" "\n"))
(string-map (lambda (x) (+ 1 x)) "HAL")
(string-map (lambda (x) (+ 1 x)) "HAL")
-(define string-for-each (lambda (proc . strings)
- (apply for-each proc (_string-ml strings))))
+(define string-for-each
+ (lambda (proc . strings)
+ (apply for-each proc (_string-ml strings))))
(string-for-each write-char "IBM\n")
(string-for-each write-char "IBM\n")