誰が何といおうが6日目です。
ってことで、何か晒そう。。。
おもむろに
$gosh
でGaucheを起動して、
(fold + 0 '(1 2 3 4 5))
を実行する。
gosh> (fold + 0 '(1 2 3 4 5)) 15
初期値が0の状態でリスト(1 2 3 4 5)を全部足してくれる。
ふむふむ。
ってことは、0と書いてある部分を10にすると、初期値が10の状態でリスト(1 2 3 4 5)を全部足してくれるってことだよね。
(fold + 10 '(1 2 3 4 5))
↑を実行するとこうなった。
gosh> (fold + 10 '(1 2 3 4 5)) 25
じゃあ、初期値を0の状態で+を*にすると…120?
(fold * 0 '(1 2 3 4 5))
gosh> (fold * 0 '(1 2 3 4 5)) 0
あっ、一番初めが0だから何を掛けても0なのか…orz
(fold * 1 '(1 2 3 4 5))
にしないといけないのか。。。
gosh> (fold * 1 '(1 2 3 4 5)) 120
うん、ここまでは何とかなりそう。
じゃあ、分数ならどうなるんだろう?
(fold * 1 '(1/2 1/3 1/4))
ここまでの結果から考えると、1/24か?
gosh> (fold * 1 '(1/2 1/3 1/4)) 1/24
予想通りでおいちゃんはうれしいです♪
んじゃ、
(fold - 0 '(1 2 3 4 5))
これは?
-15かな…?
gosh> (fold - 0 '(1 2 3 4 5)) 3
…(・ω・)ん?
(pωq)
(・ω・ ;)…なんで?
さて、どんな風に展開されるのか探そうか…
頭の中では[0 - 1 - 2 - 3 - 4 - 5 = -15]ってなってたから、中置記法に直すと…
(- (- (- (- (- 0 1) 2) 3) 4) 5)
こんな感じか…
Σ(・A・)!!
マニュアル、マニュアル…!!
検索したら、マニュアルにたどり着いたよ!!
こんなんが書いてあった!!
Function: fold kons knil clist1 clist2 …[SRFI-1] 基本リスト反復演算子です。単一のリスト clist1 = (e1 e2 … en) を与えられたときには、以下を返します。
(kons en … (kons e2 (kons e1 knil)) … )
n 本のリストが与えられた場合には、kons 関数は n+1 個の引数をとる関数でなければなりません。それぞれのリストから要素をひとつずつと、初期値 knil である「種」あるいは畳み込み状態とよばれるものです。この畳み込み演算は、もっとも短いリストの要素がなくなったところで終了します。与えられるリストの少くともひとつは有限でなければなりません。
誰か日本語に訳し(ry
(fold - 0 '(1 2 3 4 5))
これと同じ式はこうみたいだ!!1!1↓
(- 5 (- 4 (- 3 (- 2 (- 1 0)))))
ふう…
今日学んだこと : マニュアル嫁!!!