可以使用特殊形式 begin 加上 if 来定义 for-each :
;;; 23-for-each-using-if.scm
(define (for-each p lst)
(if (not (null? lst))
(begin
(p (car lst))
(for-each p (cdr lst)))))
测试:
1 ]=> (for-each (lambda (x) (newline) (display x)) (list 57 321 88))
57
321
88
;Unspecified return value
特殊形式 begin 可以确保多条表达式按顺序求值,它可以将多条表达式当作一条表达式来运行,因此可以用在只支持单条表达式的 if 形式里。
另一种定义 for-each 的办法是使用 cond :
;;; 23-another-for-each.scm
(define (for-each p lst)
(cond ((not (null? lst))
(p (car lst))
(for-each p (cdr lst)))))
测试:
1 ]=> (load "23-another-for-each.scm")
;Loading "23-another-for-each.scm"... done
;Value: for-each
1 ]=> (for-each (lambda (x) (newline) (display x)) (list 57 321 88))
57
321
88
;Unspecified return value
因为 cond 形式支持多条表达式,因此可以直接将两个表达式都放进 cond 形式之内(实际上, cond 的形式体内有一个隐式的 begin )。
See also
关于 if 、 cond 和 begin 这三个特殊形式的更多信息,可以参考手册的 Special Form 章节 。