- ifold konx knil ilist1 ilist2 ...procedure
The fundamental ilist iterator.
First, consider the single ilist-parameter case. If ilist1 is (e1 e2 ... en), then this procedure returns
(kons en ... (kons e2 (kons e1 knil)) ... )That is, it obeys the (tail) recursion
(ifold kons knil lis) ;=> (ifold kons (kons (icar lis) knil) (icdr lis)) (ifold kons knil '()) ;=> knil
Examples:
(ifold + 0 lis) ; Add up the elements of LIS. (ifold ipair '() lis) ; Reverse LIS. (ifold ipair tail rev-head) ; See APPEND-REVERSE. ;; How many symbols in LIS? (ifold (lambda (x count) (if (symbol? x) (+ count 1) count)) 0 lis) ;; Length of the longest string in LIS: (ifold (lambda (s max-len) (max max-len (string-length s))) 0 lis)
If n ilist arguments are provided, then the kons function must take n+1 parameters: one element from each ilist, and the "seed" or fold state, which is initially knil. The fold operation terminates when the shortest ilist runs out of values:
(ifold ipair* '() (iq a b c) (iq 1 2 3 4 5)) ;=> (c 3 b 2 a 1)