schemeでfoldlを実装してみた(関数名fold-left)

それでこんな関数を書いたら動いたけど、書いた本人が理解できてない...

(define (fold-left kons knil clist)
(cond
[(empty? clist) knil]
[else (fold-left kons (kons (first clist) knil)(rest clist))]))

おかしいな。なんで動くんだろう?

参考にした記事
Emacs Lisp

追記

読みなおしてるうちに理解できた。
リストが空ならknilを返すのは分かる。
elseの内容が微妙にまだ分かり切ってないけど、
リストの最初の一つを取り出して、knilにくっつけて新しいknilを作ってるみたい。
clist=(1, 2, 3) knil=empty
一回目 (fold-left cons empty (1, 2, 3))
二回目 (fold-left cons (1, e) (2, 3))
三回目 (fold-left cons (2, 1, e) (3))
四回目 (fold-left cons (3, 2, 1, e) (empty))
五回目 (3, 2, 1, e)

五回目はリストが空だから、knilを返している。このknilは今まで作ってきたリストだ。
(empty) → (1) → (2,1) → (3,2,1)となっているのでこれでリストが完成している。
こういうことっぽい。

次は高階関数について悩むことになりました(;´Д`)
それは次の記事かな?