たたみ込み

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>"

だもんな。

左から右に受け流す言語をおぼえてしまった宿命か。