呼称: リストの捜査
目的: Gauche のリストの要素を処理する方法を学ぶ
備考: 式の前に #?= を置くと評価値を表示できる
(fold <手続き> <初期値> <リスト>)
- <初期値>は、最初の<手続き>呼び出しの第2引数となる
- 次に<手続き>の結果が、次の<手続き>呼び出しの第2引数となって繰り返す
- リストの要素がなくなれば終了する
<初期値>や<手続き>の結果が第2引数になるので、手続きへ渡す引数の順番が影響する場合は考慮が必要。例えば、+ を - に変更しても意図した減算にはならない。
#!/usr/bin/gosh (define (confirm-fold-behave lis) (define (add-element a b) #?=(+ #?=(string->number a) #?=b)) (#?=fold add-element 0 #?=lis)) (define (main args) (confirm-fold-behave (cdr args)) 0)
実行結果。
$ gosh fold01.scm 1 2 3 4 5 #?=lis #?- ("1" "2" "3" "4" "5") #?=fold #?- ##?="./fold01.scm":5:(+ (debug-print (string->number a)) (debug-print b)) #?="./fold01.scm":5:(string->number a) #?- 1 #?=b #?- 0 #?- 1 #?="./fold01.scm":5:(+ (debug-print (string->number a)) (debug-print b)) #?="./fold01.scm":5:(string->number a) #?- 2 #?=b #?- 1 #?- 3 #?="./fold01.scm":5:(+ (debug-print (string->number a)) (debug-print b)) #?="./fold01.scm":5:(string->number a) #?- 3 #?=b #?- 3 #?- 6 #?="./fold01.scm":5:(+ (debug-print (string->number a)) (debug-print b)) #?="./fold01.scm":5:(string->number a) #?- 4 #?=b #?- 6 #?- 10 #?="./fold01.scm":5:(+ (debug-print (string->number a)) (debug-print b)) #?="./fold01.scm":5:(string->number a) #?- 5 #?=b #?- 10 #?- 15