One more time!
Now we’re getting ugly. Hmmmmmm.
(define (onemoretime fails? lst func)
;; acc is usually the result of the
;; "reduce so far", here it is the
;; last pair in newlst. cur is
;; current item of consideration
;; in the original list.
(define (foo acc cur)
;; func should return a new
;; pair, which gets tacked
;; onto the end of newlst.
(set-cdr! acc (func cur))
;; Have lfold push the new
;; pair into acc next
;; time it loops.
(rest acc))
(define (bar acc cur)
;; Here, func is allowed to
;; return #f signalling to
;; leave acc alone.
(let ((tst (func cur)))
(if tst
(begin (set-cdr! acc tst)
(rest acc))
acc)))
;; Grab pointer to first cons.
;; Contents of car will be dropped.
;; Contents of cdr will be clobbered.
(let ((newlst (list #f)))
(lfold (if fails? bar foo)
newlst ; Accumulator
lst) ; list we're deriving from
(rest newlst))) ; car is trash, see above.
Examples so far:
(define (append hd tl)
(onemoretime #f hd (lambda (nxt)
(cons nxt tl))))
(define (map func lst)
(onemoretime #f lst (lambda (nxt)
(list (func nxt)))))
(define (filter pred? lst)
(onemoretime #t lst (lambda (nxt)
(if (pred? nxt)
(list nxt)
#f))))
No comments yet.
Leave a Reply
-
Recent
-
Links
-
Archives
- October 2011 (1)
- January 2011 (2)
- August 2010 (5)
- July 2010 (5)
- May 2010 (3)
- March 2010 (10)
- February 2010 (7)
- November 2009 (1)
- October 2009 (1)
- August 2009 (1)
- July 2009 (3)
- April 2009 (2)
-
Categories
-
RSS
Entries RSS
Comments RSS