练习 2.23

可以使用特殊形式 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

关于 ifcondbegin 这三个特殊形式的更多信息,可以参考手册的 Special Form 章节

讨论

blog comments powered by Disqus