次のバージョンの flatten の実行順序を正確に分類するのを手伝ってくれる人はいますか? ラケットを使用しています。
バージョン 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)
2番目は次を生成します:
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) がすぐに印刷されるため、最初のループの前に2 番目のループが起動しているように見えます。一方、2 番目の例では、'(2 3) の前に 1 が出力されます。これは、append 内の flatten への最初の呼び出しが最初に評価されるように見えます。
私は Little Schemer を使用していますが、これらはより難しい例であり、実際に助けを借りることができます。
どうもありがとう。