Gauche のリスト処理手続き : 2

呼称: リストの捜査
目的: 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