receive -> let-values

svn: r8989
This commit is contained in:
Eli Barzilay 2008-03-16 15:28:42 +00:00
parent eb30bc7c88
commit e30a57b5a7
7 changed files with 91 additions and 98 deletions

View File

@ -36,8 +36,7 @@
(require mzlib/etc (require mzlib/etc
srfi/optional srfi/optional
"predicate.ss" "predicate.ss")
srfi/8/receive)
(provide filter (provide filter
partition partition
@ -115,7 +114,7 @@
(if (null-list? lis) (values lis lis) ; Use NOT-PAIR? to handle dotted lists. (if (null-list? lis) (values lis lis) ; Use NOT-PAIR? to handle dotted lists.
(let ((elt (car lis)) (let ((elt (car lis))
(tail (cdr lis))) (tail (cdr lis)))
(receive (in out) (recur tail) (let-values ([(in out) (recur tail)])
(if (pred elt) (if (pred elt)
(values (if (pair? out) (cons elt in) lis) out) (values (if (pair? out) (cons elt in) lis) out)
(values in (if (pair? in) (cons elt out) lis)))))))) (values in (if (pair? in) (cons elt out) lis))))))))

View File

@ -37,8 +37,7 @@
(require srfi/optional (require srfi/optional
"predicate.ss" "predicate.ss"
"selector.ss" "selector.ss"
"util.ss" "util.ss")
srfi/8/receive)
(provide (rename my-map map) (provide (rename my-map map)
(rename my-for-each for-each) (rename my-for-each for-each)
@ -88,7 +87,7 @@
(check-arg procedure? kons 'fold) (check-arg procedure? kons 'fold)
(if (pair? lists) (if (pair? lists)
(let lp ((lists (cons lis1 lists)) (ans knil)) ; N-ary case (let lp ((lists (cons lis1 lists)) (ans knil)) ; N-ary case
(receive (cars+ans cdrs) (%cars+cdrs+ lists ans) (let-values ([(cars+ans cdrs) (%cars+cdrs+ lists ans)])
(if (null? cars+ans) ans ; Done. (if (null? cars+ans) ans ; Done.
(lp cdrs (apply kons cars+ans))))) (lp cdrs (apply kons cars+ans)))))
(let lp ((lis lis1) (ans knil)) ; Fast path (let lp ((lis lis1) (ans knil)) ; Fast path
@ -158,11 +157,11 @@
(define (really-append-map who appender f lis1 lists) (define (really-append-map who appender f lis1 lists)
(check-arg procedure? f 'who) (check-arg procedure? f 'who)
(if (pair? lists) (if (pair? lists)
(receive (cars cdrs) (%cars+cdrs (cons lis1 lists)) (let-values ([(cars cdrs) (%cars+cdrs (cons lis1 lists))])
(if (null? cars) '() (if (null? cars) '()
(let recur ((cars cars) (cdrs cdrs)) (let recur ((cars cars) (cdrs cdrs))
(let ((vals (apply f cars))) (let ((vals (apply f cars)))
(receive (cars2 cdrs2) (%cars+cdrs cdrs) (let-values ([(cars2 cdrs2) (%cars+cdrs cdrs)])
(if (null? cars2) vals (if (null? cars2) vals
(appender vals (recur cars2 cdrs2)))))))) (appender vals (recur cars2 cdrs2))))))))
;; Fast path ;; Fast path
@ -194,7 +193,7 @@
(if (pair? lists) (if (pair? lists)
(let lp ((lis1 lis1) (lists lists)) (let lp ((lis1 lis1) (lists lists))
(if (not (null-list? lis1)) (if (not (null-list? lis1))
(receive (heads tails) (%cars+cdrs/no-test lists) (let-values ([(heads tails) (%cars+cdrs/no-test lists)])
(set-car! lis1 (apply f (car lis1) heads)) (set-car! lis1 (apply f (car lis1) heads))
(lp (cdr lis1) tails)))) (lp (cdr lis1) tails))))
;; Fast path. ;; Fast path.
@ -206,7 +205,7 @@
(check-arg procedure? f 'filter-map) (check-arg procedure? f 'filter-map)
(if (pair? lists) (if (pair? lists)
(let recur ((lists (cons lis1 lists))) (let recur ((lists (cons lis1 lists)))
(receive (cars cdrs) (%cars+cdrs lists) (let-values ([(cars cdrs) (%cars+cdrs lists)])
(if (pair? cars) (if (pair? cars)
(cond ((apply f cars) => (lambda (x) (cons x (recur cdrs)))) (cond ((apply f cars) => (lambda (x) (cons x (recur cdrs))))
(else (recur cdrs))) ; Tail call in this arm. (else (recur cdrs))) ; Tail call in this arm.
@ -226,7 +225,7 @@
(check-arg procedure? f 'map-in-order) (check-arg procedure? f 'map-in-order)
(if (pair? lists) (if (pair? lists)
(let recur ((lists (cons lis1 lists))) (let recur ((lists (cons lis1 lists)))
(receive (cars cdrs) (%cars+cdrs lists) (let-values ([(cars cdrs) (%cars+cdrs lists)])
(if (pair? cars) (if (pair? cars)
(let ((x (apply f cars))) ; Do head first, (let ((x (apply f cars))) ; Do head first,
(cons x (recur cdrs))) ; then tail. (cons x (recur cdrs))) ; then tail.
@ -250,7 +249,7 @@
(check-arg procedure? f for-each) (check-arg procedure? f for-each)
(if (pair? lists) (if (pair? lists)
(let recur ((lists (cons lis1 lists))) (let recur ((lists (cons lis1 lists)))
(receive (cars cdrs) (%cars+cdrs lists) (let-values ([(cars cdrs) (%cars+cdrs lists)])
(if (pair? cars) (if (pair? cars)
(begin (begin
(apply f cars) ; Do head first, (apply f cars) ; Do head first,

View File

@ -40,8 +40,7 @@
(rename "search.ss" s:member member) (rename "search.ss" s:member member)
"delete.ss" "delete.ss"
"predicate.ss" "predicate.ss"
"filter.ss" "filter.ss")
srfi/8/receive)
(provide lset<= (provide lset<=
lset= lset=
@ -178,7 +177,7 @@
;; built in. ;; built in.
;; Compute a-b and a^b, then compute b-(a^b) and ;; Compute a-b and a^b, then compute b-(a^b) and
;; cons it onto the front of a-b. ;; cons it onto the front of a-b.
(receive (a-b a-int-b) (lset-diff+intersection = a b) (let-values ([(a-b a-int-b) (lset-diff+intersection = a b)])
(cond ((null? a-b) (lset-difference = b a)) (cond ((null? a-b) (lset-difference = b a))
((null? a-int-b) (append b a)) ((null? a-int-b) (append b a))
(else (fold (lambda (xb ans) (else (fold (lambda (xb ans)
@ -199,7 +198,7 @@
;; built in. ;; built in.
;; Compute a-b and a^b, then compute b-(a^b) and ;; Compute a-b and a^b, then compute b-(a^b) and
;; cons it onto the front of a-b. ;; cons it onto the front of a-b.
(receive (a-b a-int-b) (lset-diff+intersection! = a b) (let-values ([(a-b a-int-b) (lset-diff+intersection! = a b)])
(cond ((null? a-b) (lset-difference! = b a)) (cond ((null? a-b) (lset-difference! = b a))
((null? a-int-b) (append! b a)) ((null? a-int-b) (append! b a))
(else (pair-fold (else (pair-fold

View File

@ -39,8 +39,7 @@
"selector.ss" "selector.ss"
"util.ss" "util.ss"
(only "fold.ss" reduce-right) (only "fold.ss" reduce-right)
(rename "fold.ss" srfi-1:map map) (rename "fold.ss" srfi-1:map map))
srfi/8/receive)
(provide length+ (provide length+
concatenate concatenate
@ -65,7 +64,7 @@
;; N-ary case ;; N-ary case
(let lp ((list1 list1) (lists lists) (i 0)) (let lp ((list1 list1) (lists lists) (i 0))
(if (null-list? list1) i (if (null-list? list1) i
(receive (as ds) (%cars+cdrs lists) (let-values ([(as ds) (%cars+cdrs lists)])
(if (null? as) i (if (null? as) i
(lp (cdr list1) ds (lp (cdr list1) ds
(if (apply pred (car list1) as) (+ i 1) i)))))) (if (apply pred (car list1) as) (+ i 1) i))))))
@ -98,7 +97,7 @@
(let recur ((lis lis)) (let recur ((lis lis))
(if (null-list? lis) (values lis lis) ; Use NOT-PAIR? to handle (if (null-list? lis) (values lis lis) ; Use NOT-PAIR? to handle
(let ((elt (car lis))) ; dotted lists. (let ((elt (car lis))) ; dotted lists.
(receive (a b) (recur (cdr lis)) (let-values ([(a b) (recur (cdr lis))])
(values (cons (car elt) a) (values (cons (car elt) a)
(cons (cadr elt) b))))))) (cons (cadr elt) b)))))))
@ -106,7 +105,7 @@
(let recur ((lis lis)) (let recur ((lis lis))
(if (null-list? lis) (values lis lis lis) (if (null-list? lis) (values lis lis lis)
(let ((elt (car lis))) (let ((elt (car lis)))
(receive (a b c) (recur (cdr lis)) (let-values ([(a b c) (recur (cdr lis))])
(values (cons (car elt) a) (values (cons (car elt) a)
(cons (cadr elt) b) (cons (cadr elt) b)
(cons (caddr elt) c))))))) (cons (caddr elt) c)))))))
@ -115,7 +114,7 @@
(let recur ((lis lis)) (let recur ((lis lis))
(if (null-list? lis) (values lis lis lis lis) (if (null-list? lis) (values lis lis lis lis)
(let ((elt (car lis))) (let ((elt (car lis)))
(receive (a b c d) (recur (cdr lis)) (let-values ([(a b c d) (recur (cdr lis))])
(values (cons (car elt) a) (values (cons (car elt) a)
(cons (cadr elt) b) (cons (cadr elt) b)
(cons (caddr elt) c) (cons (caddr elt) c)
@ -125,7 +124,7 @@
(let recur ((lis lis)) (let recur ((lis lis))
(if (null-list? lis) (values lis lis lis lis lis) (if (null-list? lis) (values lis lis lis lis lis)
(let ((elt (car lis))) (let ((elt (car lis)))
(receive (a b c d e) (recur (cdr lis)) (let-values ([(a b c d e) (recur (cdr lis))])
(values (cons (car elt) a) (values (cons (car elt) a)
(cons (cadr elt) b) (cons (cadr elt) b)
(cons (caddr elt) c) (cons (caddr elt) c)

View File

@ -37,8 +37,7 @@
(require mzlib/etc (require mzlib/etc
srfi/optional srfi/optional
"predicate.ss" "predicate.ss"
"util.ss" "util.ss")
srfi/8/receive)
(provide (rename my-member member) (provide (rename my-member member)
find find
@ -107,7 +106,7 @@
(if (null-list? lis) (values '() '()) (if (null-list? lis) (values '() '())
(let ((x (car lis))) (let ((x (car lis)))
(if (pred x) (if (pred x)
(receive (prefix suffix) (recur (cdr lis)) (let-values ([(prefix suffix) (recur (cdr lis))])
(values (cons x prefix) suffix)) (values (cons x prefix) suffix))
(values '() lis)))))) (values '() lis))))))
@ -131,10 +130,10 @@
(check-arg procedure? pred 'any) (check-arg procedure? pred 'any)
(if (pair? lists) (if (pair? lists)
;; N-ary case ;; N-ary case
(receive (heads tails) (%cars+cdrs (cons lis1 lists)) (let-values ([(heads tails) (%cars+cdrs (cons lis1 lists))])
(and (pair? heads) (and (pair? heads)
(let lp ((heads heads) (tails tails)) (let lp ((heads heads) (tails tails))
(receive (next-heads next-tails) (%cars+cdrs tails) (let-values ([(next-heads next-tails) (%cars+cdrs tails)])
(if (pair? next-heads) (if (pair? next-heads)
(or (apply pred heads) (lp next-heads next-tails)) (or (apply pred heads) (lp next-heads next-tails))
(apply pred heads)))))) ; Last PRED app is tail call. (apply pred heads)))))) ; Last PRED app is tail call.
@ -155,10 +154,10 @@
(check-arg procedure? pred 'every) (check-arg procedure? pred 'every)
(if (pair? lists) (if (pair? lists)
;; N-ary case ;; N-ary case
(receive (heads tails) (%cars+cdrs (cons lis1 lists)) (let-values ([(heads tails) (%cars+cdrs (cons lis1 lists))])
(or (not (pair? heads)) (or (not (pair? heads))
(let lp ((heads heads) (tails tails)) (let lp ((heads heads) (tails tails))
(receive (next-heads next-tails) (%cars+cdrs tails) (let-values ([(next-heads next-tails) (%cars+cdrs tails)])
(if (pair? next-heads) (if (pair? next-heads)
(and (apply pred heads) (lp next-heads next-tails)) (and (apply pred heads) (lp next-heads next-tails))
(apply pred heads)))))) ; Last PRED app is tail call. (apply pred heads)))))) ; Last PRED app is tail call.
@ -174,7 +173,7 @@
(if (pair? lists) (if (pair? lists)
;; N-ary case ;; N-ary case
(let lp ((lists (cons lis1 lists)) (n 0)) (let lp ((lists (cons lis1 lists)) (n 0))
(receive (heads tails) (%cars+cdrs lists) (let-values ([(heads tails) (%cars+cdrs lists)])
(and (pair? heads) (and (pair? heads)
(if (apply pred heads) n (if (apply pred heads) n
(lp tails (+ n 1)))))) (lp tails (+ n 1))))))

View File

@ -34,8 +34,7 @@
#lang mzscheme #lang mzscheme
(require srfi/optional (require srfi/optional)
srfi/8/receive)
(provide first second (provide first second
third fourth third fourth
@ -120,7 +119,7 @@
(check-arg integer? k 'split-at) (check-arg integer? k 'split-at)
(let recur ((lis x) (k k)) (let recur ((lis x) (k k))
(if (zero? k) (values '() lis) (if (zero? k) (values '() lis)
(receive (prefix suffix) (recur (cdr lis) (- k 1)) (let-values ([(prefix suffix) (recur (cdr lis) (- k 1))])
(values (cons (car lis) prefix) suffix))))) (values (cons (car lis) prefix) suffix)))))
#; #;

View File

@ -36,8 +36,7 @@
(require srfi/optional (require srfi/optional
"predicate.ss" "predicate.ss"
"selector.ss" "selector.ss")
srfi/8/receive)
(provide %cdrs (provide %cdrs
%cars+ %cars+
@ -88,11 +87,11 @@
(lambda (abort) (lambda (abort)
(let recur ((lists lists)) (let recur ((lists lists))
(if (pair? lists) (if (pair? lists)
(receive (list other-lists) (car+cdr lists) (let-values ([(list other-lists) (car+cdr lists)])
(if (null-list? list) (abort '() '()) ; LIST is empty -- bail out (if (null-list? list) (abort '() '()) ; LIST is empty -- bail out
(receive (a d) (car+cdr list) (let-values ([(a d) (car+cdr list)]
(receive (cars cdrs) (recur other-lists) [(cars cdrs) (recur other-lists)])
(values (cons a cars) (cons d cdrs)))))) (values (cons a cars) (cons d cdrs)))))
(values '() '())))))) (values '() '()))))))
;; Like %CARS+CDRS, but we pass in a final elt tacked onto the end of the ;; Like %CARS+CDRS, but we pass in a final elt tacked onto the end of the
@ -102,21 +101,21 @@
(lambda (abort) (lambda (abort)
(let recur ((lists lists)) (let recur ((lists lists))
(if (pair? lists) (if (pair? lists)
(receive (list other-lists) (car+cdr lists) (let-values ([(list other-lists) (car+cdr lists)])
(if (null-list? list) (abort '() '()) ; LIST is empty -- bail out (if (null-list? list) (abort '() '()) ; LIST is empty -- bail out
(receive (a d) (car+cdr list) (let-values ([(a d) (car+cdr list)]
(receive (cars cdrs) (recur other-lists) [(cars cdrs) (recur other-lists)])
(values (cons a cars) (cons d cdrs)))))) (values (cons a cars) (cons d cdrs)))))
(values (list cars-final) '())))))) (values (list cars-final) '()))))))
;; Like %CARS+CDRS, but blow up if any list is empty. ;; Like %CARS+CDRS, but blow up if any list is empty.
(define (%cars+cdrs/no-test lists) (define (%cars+cdrs/no-test lists)
(let recur ((lists lists)) (let recur ((lists lists))
(if (pair? lists) (if (pair? lists)
(receive (list other-lists) (car+cdr lists) (let*-values ([(list other-lists) (car+cdr lists)]
(receive (a d) (car+cdr list) [(a d) (car+cdr list)]
(receive (cars cdrs) (recur other-lists) [(cars cdrs) (recur other-lists)])
(values (cons a cars) (cons d cdrs))))) (values (cons a cars) (cons d cdrs)))
(values '() '())))) (values '() '()))))
;;; util.ss ends here ;;; util.ss ends here