有人可以帮我准确分解以下扁平化版本的执行顺序吗?我正在使用球拍。
版本 1,来自球拍本身,而版本 2 是更常见的?执行。
(define (flatten1 list)
(let loop ([l list] [acc null])
(printf "l = ~a acc = ~a\n" l acc)
(cond [(null? l) acc]
[(pair? l) (loop (car l) (loop (cdr l) acc))]
[else (cons l acc)])))
(define (flatten2 l)
(printf "l = ~a\n" l)
(cond [(null? l) null]
[(atom? l) (list l)]
[else (append (flatten2 (car l)) (flatten2 (cdr l)))]))
现在,使用 '(1 2 3) 运行第一个示例会产生:
l = (1 2 3) acc = ()
l = (2 3) acc = ()
l = (3) acc = ()
l = () acc = ()
l = 3 acc = ()
l = 2 acc = (3)
l = 1 acc = (2 3)
'(1 2 3)
而第二个产生:
l = (1 2 3)
l = 1
l = (2 3)
l = 2
l = (3)
l = 3
l = ()
'(1 2 3)
执行顺序似乎不同。在第一个示例中,看起来第二个循环(loop (cdr l) acc)
在第一个循环之前触发,因为 '(2 3) 正在立即打印。而在第二个示例中, 1 在 '(2 3) 之前打印,这似乎是首先评估第一个在 append 内部进行 flatten 的调用。
我正在浏览 Little Schemer,但这些是更难的例子,我真的可以使用一些帮助。
非常感谢。