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