たたみ込み
rubyのinjectとの違いを発見した。というかだからfoldがおぼえられないとわかった。
rubyだと
irb(main):002:0> ["a","b","c"].inject("s"){|r,i| r+i} => "sabc"
schemeだと
gosh> (fold string-append "s" '("a" "b" "c")) "cbas" gosh> (fold-right string-append "s" '("a" "b" "c")) "abcs"
つまり、rubyだとイテレータ中の操作、schemeだとたたみ込まれる関数へ与える引数の順序が異なる。(ruby->"sabc"なのに対しscheme->"cbas"となっている点)
こいつの理由がわからない。何故なんだろう。
irb(main):004:0> ["a","b","c"].inject("s"){|a,b|[a,b]} => [[["s", "a"], "b"], "c"] gosh> (fold list "s" '("a" "b" "c")) ("c" ("b" ("a" "s")))
まあ、違うことはおぼえたので書いておく。
しかし、injectはあんまつかわないんだな。
rubyじゃ
irb(main):003:0> [[/\n/,"<br>"],[/c/,"d"]].inject("a\nb\nc\n"){|r,i|r.gsub(i[0]){i[1]}} => "a<br>b<br>d<br>"
こんなことしない。
irb(main):005:0> "a\nb\nc\n".gsub(/\n/){"<br>"}.gsub(/c/){"d"} => "a<br>b<br>d<br>"
だもんな。
左から右に受け流す言語をおぼえてしまった宿命か。