* moved map and for-each to ikarus.lists
This commit is contained in:
parent
0f567805fc
commit
a6faa9fb39
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -129,11 +129,6 @@
|
||||||
(cons ($car a) (cons ($cdr a) ac))))]))])
|
(cons ($car a) (cons ($cdr a) ac))))]))])
|
||||||
(f ($symbol-plist x) '()))))
|
(f ($symbol-plist x) '()))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(primitive-set! 'apply
|
(primitive-set! 'apply
|
||||||
(let ()
|
(let ()
|
||||||
(define (err f ls)
|
(define (err f ls)
|
||||||
|
@ -167,212 +162,8 @@
|
||||||
(fixandgo f a0 a1 ls ls ($cdr ls))]))
|
(fixandgo f a0 a1 ls ls ($cdr ls))]))
|
||||||
apply))
|
apply))
|
||||||
|
|
||||||
(let ()
|
|
||||||
(define who 'map)
|
|
||||||
(define len
|
|
||||||
(lambda (h t n)
|
|
||||||
(if (pair? h)
|
|
||||||
(let ([h ($cdr h)])
|
|
||||||
(if (pair? h)
|
|
||||||
(if (eq? h t)
|
|
||||||
(error who "circular list")
|
|
||||||
(len ($cdr h) ($cdr t) ($fx+ n 2)))
|
|
||||||
(if (null? h)
|
|
||||||
($fxadd1 n)
|
|
||||||
(error who "improper list"))))
|
|
||||||
(if (null? h)
|
|
||||||
n
|
|
||||||
(error who "improper list")))))
|
|
||||||
(define map1
|
|
||||||
(lambda (f a d n)
|
|
||||||
(cond
|
|
||||||
[(pair? d)
|
|
||||||
(if ($fxzero? n)
|
|
||||||
(error who "list was altered!")
|
|
||||||
(cons (f a)
|
|
||||||
(map1 f ($car d) ($cdr d) ($fxsub1 n))))]
|
|
||||||
[(null? d)
|
|
||||||
(if ($fxzero? n)
|
|
||||||
(cons (f a) '())
|
|
||||||
(error who "list was altered"))]
|
|
||||||
[else (error who "list was altered")])))
|
|
||||||
(define map2
|
|
||||||
(lambda (f a1 a2 d1 d2 n)
|
|
||||||
(cond
|
|
||||||
[(pair? d1)
|
|
||||||
(cond
|
|
||||||
[(pair? d2)
|
|
||||||
(if ($fxzero? n)
|
|
||||||
(error who "list was altered")
|
|
||||||
(cons (f a1 a2)
|
|
||||||
(map2 f
|
|
||||||
($car d1) ($car d2)
|
|
||||||
($cdr d1) ($cdr d2)
|
|
||||||
($fxsub1 n))))]
|
|
||||||
[else (error who "length mismatch")])]
|
|
||||||
[(null? d1)
|
|
||||||
(cond
|
|
||||||
[(null? d2)
|
|
||||||
(if ($fxzero? n)
|
|
||||||
(cons (f a1 a2) '())
|
|
||||||
(error who "list was altered"))]
|
|
||||||
[else (error who "length mismatch")])]
|
|
||||||
[else (error who "list was altered")])))
|
|
||||||
(define cars
|
|
||||||
(lambda (ls*)
|
|
||||||
(cond
|
|
||||||
[(null? ls*) '()]
|
|
||||||
[else
|
|
||||||
(let ([a (car ls*)])
|
|
||||||
(cond
|
|
||||||
[(pair? a)
|
|
||||||
(cons (car a) (cars (cdr ls*)))]
|
|
||||||
[else
|
|
||||||
(error 'map "length mismatch")]))])))
|
|
||||||
(define cdrs
|
|
||||||
(lambda (ls*)
|
|
||||||
(cond
|
|
||||||
[(null? ls*) '()]
|
|
||||||
[else
|
|
||||||
(let ([a (car ls*)])
|
|
||||||
(cond
|
|
||||||
[(pair? a)
|
|
||||||
(cons (cdr a) (cdrs (cdr ls*)))]
|
|
||||||
[else
|
|
||||||
(error 'map "length mismatch")]))])))
|
|
||||||
(define mapm
|
|
||||||
(lambda (f ls ls* n)
|
|
||||||
(cond
|
|
||||||
[(null? ls)
|
|
||||||
(if (andmap null? ls*)
|
|
||||||
(if (fxzero? n)
|
|
||||||
'()
|
|
||||||
(error 'map "lists were mutated during operation"))
|
|
||||||
(error 'map "length mismatch"))]
|
|
||||||
[(fxzero? n)
|
|
||||||
(error 'map "lists were mutated during operation")]
|
|
||||||
[else
|
|
||||||
(cons
|
|
||||||
(apply f (car ls) (cars ls*))
|
|
||||||
(mapm f (cdr ls) (cdrs ls*) (fxsub1 n)))])))
|
|
||||||
(primitive-set! 'map
|
|
||||||
(case-lambda
|
|
||||||
[(f ls)
|
|
||||||
(unless (procedure? f)
|
|
||||||
(error who "~s is not a procedure" f))
|
|
||||||
(cond
|
|
||||||
[(pair? ls)
|
|
||||||
(let ([d ($cdr ls)])
|
|
||||||
(map1 f ($car ls) d (len d d 0)))]
|
|
||||||
[(null? ls) '()]
|
|
||||||
[else (error who "improper list")])]
|
|
||||||
[(f ls ls2)
|
|
||||||
(unless (procedure? f)
|
|
||||||
(error who "~s is not a procedure" f))
|
|
||||||
(cond
|
|
||||||
[(pair? ls)
|
|
||||||
(if (pair? ls2)
|
|
||||||
(let ([d ($cdr ls)])
|
|
||||||
(map2 f ($car ls) ($car ls2) d ($cdr ls2) (len d d 0)))
|
|
||||||
(error who "length mismatch"))]
|
|
||||||
[(null? ls)
|
|
||||||
(if (null? ls2)
|
|
||||||
'()
|
|
||||||
(error who "length mismatch"))]
|
|
||||||
[else (error who "not a list")])]
|
|
||||||
[(f ls . ls*)
|
|
||||||
(unless (procedure? f)
|
|
||||||
(error who "~s is not a procedure" f))
|
|
||||||
(cond
|
|
||||||
[(pair? ls)
|
|
||||||
(let ([n (len ls ls 0)])
|
|
||||||
(mapm f ls ls* n))]
|
|
||||||
[(null? ls)
|
|
||||||
(if (andmap null? ls*)
|
|
||||||
'()
|
|
||||||
(error who "length mismatch"))])])))
|
|
||||||
|
|
||||||
|
|
||||||
(let ()
|
|
||||||
(define who 'for-each)
|
|
||||||
(define len
|
|
||||||
(lambda (h t n)
|
|
||||||
(if (pair? h)
|
|
||||||
(let ([h ($cdr h)])
|
|
||||||
(if (pair? h)
|
|
||||||
(if (eq? h t)
|
|
||||||
(error who "circular list")
|
|
||||||
(len ($cdr h) ($cdr t) ($fx+ n 2)))
|
|
||||||
(if (null? h)
|
|
||||||
($fxadd1 n)
|
|
||||||
(error who "improper list"))))
|
|
||||||
(if (null? h)
|
|
||||||
n
|
|
||||||
(error who "improper list")))))
|
|
||||||
(define for-each1
|
|
||||||
(lambda (f a d n)
|
|
||||||
(cond
|
|
||||||
[(pair? d)
|
|
||||||
(if ($fxzero? n)
|
|
||||||
(error who "list was altered!")
|
|
||||||
(begin
|
|
||||||
(f a)
|
|
||||||
(for-each1 f ($car d) ($cdr d) ($fxsub1 n))))]
|
|
||||||
[(null? d)
|
|
||||||
(if ($fxzero? n)
|
|
||||||
(f a)
|
|
||||||
(error who "list was altered"))]
|
|
||||||
[else (error who "list was altered")])))
|
|
||||||
(define for-each2
|
|
||||||
(lambda (f a1 a2 d1 d2 n)
|
|
||||||
(cond
|
|
||||||
[(pair? d1)
|
|
||||||
(cond
|
|
||||||
[(pair? d2)
|
|
||||||
(if ($fxzero? n)
|
|
||||||
(error who "list was altered")
|
|
||||||
(begin
|
|
||||||
(f a1 a2)
|
|
||||||
(for-each2 f
|
|
||||||
($car d1) ($car d2)
|
|
||||||
($cdr d1) ($cdr d2)
|
|
||||||
($fxsub1 n))))]
|
|
||||||
[else (error who "length mismatch")])]
|
|
||||||
[(null? d1)
|
|
||||||
(cond
|
|
||||||
[(null? d2)
|
|
||||||
(if ($fxzero? n)
|
|
||||||
(f a1 a2)
|
|
||||||
(error who "list was altered"))]
|
|
||||||
[else (error who "length mismatch")])]
|
|
||||||
[else (error who "list was altered")])))
|
|
||||||
(primitive-set! 'for-each
|
|
||||||
(case-lambda
|
|
||||||
[(f ls)
|
|
||||||
(unless (procedure? f)
|
|
||||||
(error who "~s is not a procedure" f))
|
|
||||||
(cond
|
|
||||||
[(pair? ls)
|
|
||||||
(let ([d ($cdr ls)])
|
|
||||||
(for-each1 f ($car ls) d (len d d 0)))]
|
|
||||||
[(null? ls) (void)]
|
|
||||||
[else (error who "improper list")])]
|
|
||||||
[(f ls ls2)
|
|
||||||
(unless (procedure? f)
|
|
||||||
(error who "~s is not a procedure" f))
|
|
||||||
(cond
|
|
||||||
[(pair? ls)
|
|
||||||
(if (pair? ls2)
|
|
||||||
(let ([d ($cdr ls)])
|
|
||||||
(for-each2 f
|
|
||||||
($car ls) ($car ls2) d ($cdr ls2) (len d d 0)))
|
|
||||||
(error who "length mismatch"))]
|
|
||||||
[(null? ls)
|
|
||||||
(if (null? ls2)
|
|
||||||
(void)
|
|
||||||
(error who "length mismatch"))]
|
|
||||||
[else (error who "not a list")])]
|
|
||||||
[_ (error who "vararg not supported yet")])))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
|
|
||||||
(library (ikarus lists)
|
(library (ikarus lists)
|
||||||
(export $memq list? length list-ref reverse last-pair
|
(export $memq list? length list-ref reverse last-pair
|
||||||
memq memv member assq assv assoc)
|
memq memv member assq assv assoc
|
||||||
|
map for-each)
|
||||||
(import
|
(import
|
||||||
(only (scheme) $car $cdr $fx+ $fxsub1 $fxzero? $fx>=)
|
(only (scheme) $car $cdr $fx+ $fxadd1 $fxsub1 $fxzero? $fx>=)
|
||||||
|
|
||||||
(except (ikarus) list? reverse last-pair length list-ref
|
(except (ikarus) list? reverse last-pair length list-ref
|
||||||
memq memv member assq assv assoc))
|
memq memv member assq assv assoc
|
||||||
|
map for-each))
|
||||||
|
|
||||||
(define $memq
|
(define $memq
|
||||||
(lambda (x ls)
|
(lambda (x ls)
|
||||||
|
@ -249,6 +250,211 @@
|
||||||
(lambda (x ls)
|
(lambda (x ls)
|
||||||
(race x ls ls ls))))
|
(race x ls ls ls))))
|
||||||
|
|
||||||
|
(module (map)
|
||||||
|
(define who 'map)
|
||||||
|
(define len
|
||||||
|
(lambda (h t n)
|
||||||
|
(if (pair? h)
|
||||||
|
(let ([h ($cdr h)])
|
||||||
|
(if (pair? h)
|
||||||
|
(if (eq? h t)
|
||||||
|
(error who "circular list")
|
||||||
|
(len ($cdr h) ($cdr t) ($fx+ n 2)))
|
||||||
|
(if (null? h)
|
||||||
|
($fxadd1 n)
|
||||||
|
(error who "improper list"))))
|
||||||
|
(if (null? h)
|
||||||
|
n
|
||||||
|
(error who "improper list")))))
|
||||||
|
(define map1
|
||||||
|
(lambda (f a d n)
|
||||||
|
(cond
|
||||||
|
[(pair? d)
|
||||||
|
(if ($fxzero? n)
|
||||||
|
(error who "list was altered!")
|
||||||
|
(cons (f a)
|
||||||
|
(map1 f ($car d) ($cdr d) ($fxsub1 n))))]
|
||||||
|
[(null? d)
|
||||||
|
(if ($fxzero? n)
|
||||||
|
(cons (f a) '())
|
||||||
|
(error who "list was altered"))]
|
||||||
|
[else (error who "list was altered")])))
|
||||||
|
(define map2
|
||||||
|
(lambda (f a1 a2 d1 d2 n)
|
||||||
|
(cond
|
||||||
|
[(pair? d1)
|
||||||
|
(cond
|
||||||
|
[(pair? d2)
|
||||||
|
(if ($fxzero? n)
|
||||||
|
(error who "list was altered")
|
||||||
|
(cons (f a1 a2)
|
||||||
|
(map2 f
|
||||||
|
($car d1) ($car d2)
|
||||||
|
($cdr d1) ($cdr d2)
|
||||||
|
($fxsub1 n))))]
|
||||||
|
[else (error who "length mismatch")])]
|
||||||
|
[(null? d1)
|
||||||
|
(cond
|
||||||
|
[(null? d2)
|
||||||
|
(if ($fxzero? n)
|
||||||
|
(cons (f a1 a2) '())
|
||||||
|
(error who "list was altered"))]
|
||||||
|
[else (error who "length mismatch")])]
|
||||||
|
[else (error who "list was altered")])))
|
||||||
|
(define cars
|
||||||
|
(lambda (ls*)
|
||||||
|
(cond
|
||||||
|
[(null? ls*) '()]
|
||||||
|
[else
|
||||||
|
(let ([a (car ls*)])
|
||||||
|
(cond
|
||||||
|
[(pair? a)
|
||||||
|
(cons (car a) (cars (cdr ls*)))]
|
||||||
|
[else
|
||||||
|
(error 'map "length mismatch")]))])))
|
||||||
|
(define cdrs
|
||||||
|
(lambda (ls*)
|
||||||
|
(cond
|
||||||
|
[(null? ls*) '()]
|
||||||
|
[else
|
||||||
|
(let ([a (car ls*)])
|
||||||
|
(cond
|
||||||
|
[(pair? a)
|
||||||
|
(cons (cdr a) (cdrs (cdr ls*)))]
|
||||||
|
[else
|
||||||
|
(error 'map "length mismatch")]))])))
|
||||||
|
(define mapm
|
||||||
|
(lambda (f ls ls* n)
|
||||||
|
(cond
|
||||||
|
[(null? ls)
|
||||||
|
(if (andmap null? ls*)
|
||||||
|
(if (fxzero? n)
|
||||||
|
'()
|
||||||
|
(error 'map "lists were mutated during operation"))
|
||||||
|
(error 'map "length mismatch"))]
|
||||||
|
[(fxzero? n)
|
||||||
|
(error 'map "lists were mutated during operation")]
|
||||||
|
[else
|
||||||
|
(cons
|
||||||
|
(apply f (car ls) (cars ls*))
|
||||||
|
(mapm f (cdr ls) (cdrs ls*) (fxsub1 n)))])))
|
||||||
|
(define map
|
||||||
|
(case-lambda
|
||||||
|
[(f ls)
|
||||||
|
(unless (procedure? f)
|
||||||
|
(error who "~s is not a procedure" f))
|
||||||
|
(cond
|
||||||
|
[(pair? ls)
|
||||||
|
(let ([d ($cdr ls)])
|
||||||
|
(map1 f ($car ls) d (len d d 0)))]
|
||||||
|
[(null? ls) '()]
|
||||||
|
[else (error who "improper list")])]
|
||||||
|
[(f ls ls2)
|
||||||
|
(unless (procedure? f)
|
||||||
|
(error who "~s is not a procedure" f))
|
||||||
|
(cond
|
||||||
|
[(pair? ls)
|
||||||
|
(if (pair? ls2)
|
||||||
|
(let ([d ($cdr ls)])
|
||||||
|
(map2 f ($car ls) ($car ls2) d ($cdr ls2) (len d d 0)))
|
||||||
|
(error who "length mismatch"))]
|
||||||
|
[(null? ls)
|
||||||
|
(if (null? ls2)
|
||||||
|
'()
|
||||||
|
(error who "length mismatch"))]
|
||||||
|
[else (error who "not a list")])]
|
||||||
|
[(f ls . ls*)
|
||||||
|
(unless (procedure? f)
|
||||||
|
(error who "~s is not a procedure" f))
|
||||||
|
(cond
|
||||||
|
[(pair? ls)
|
||||||
|
(let ([n (len ls ls 0)])
|
||||||
|
(mapm f ls ls* n))]
|
||||||
|
[(null? ls)
|
||||||
|
(if (andmap null? ls*)
|
||||||
|
'()
|
||||||
|
(error who "length mismatch"))])])))
|
||||||
|
|
||||||
|
(module (for-each)
|
||||||
|
(define who 'for-each)
|
||||||
|
(define len
|
||||||
|
(lambda (h t n)
|
||||||
|
(if (pair? h)
|
||||||
|
(let ([h ($cdr h)])
|
||||||
|
(if (pair? h)
|
||||||
|
(if (eq? h t)
|
||||||
|
(error who "circular list")
|
||||||
|
(len ($cdr h) ($cdr t) ($fx+ n 2)))
|
||||||
|
(if (null? h)
|
||||||
|
($fxadd1 n)
|
||||||
|
(error who "improper list"))))
|
||||||
|
(if (null? h)
|
||||||
|
n
|
||||||
|
(error who "improper list")))))
|
||||||
|
(define for-each1
|
||||||
|
(lambda (f a d n)
|
||||||
|
(cond
|
||||||
|
[(pair? d)
|
||||||
|
(if ($fxzero? n)
|
||||||
|
(error who "list was altered!")
|
||||||
|
(begin
|
||||||
|
(f a)
|
||||||
|
(for-each1 f ($car d) ($cdr d) ($fxsub1 n))))]
|
||||||
|
[(null? d)
|
||||||
|
(if ($fxzero? n)
|
||||||
|
(f a)
|
||||||
|
(error who "list was altered"))]
|
||||||
|
[else (error who "list was altered")])))
|
||||||
|
(define for-each2
|
||||||
|
(lambda (f a1 a2 d1 d2 n)
|
||||||
|
(cond
|
||||||
|
[(pair? d1)
|
||||||
|
(cond
|
||||||
|
[(pair? d2)
|
||||||
|
(if ($fxzero? n)
|
||||||
|
(error who "list was altered")
|
||||||
|
(begin
|
||||||
|
(f a1 a2)
|
||||||
|
(for-each2 f
|
||||||
|
($car d1) ($car d2)
|
||||||
|
($cdr d1) ($cdr d2)
|
||||||
|
($fxsub1 n))))]
|
||||||
|
[else (error who "length mismatch")])]
|
||||||
|
[(null? d1)
|
||||||
|
(cond
|
||||||
|
[(null? d2)
|
||||||
|
(if ($fxzero? n)
|
||||||
|
(f a1 a2)
|
||||||
|
(error who "list was altered"))]
|
||||||
|
[else (error who "length mismatch")])]
|
||||||
|
[else (error who "list was altered")])))
|
||||||
|
(define for-each
|
||||||
|
(case-lambda
|
||||||
|
[(f ls)
|
||||||
|
(unless (procedure? f)
|
||||||
|
(error who "~s is not a procedure" f))
|
||||||
|
(cond
|
||||||
|
[(pair? ls)
|
||||||
|
(let ([d ($cdr ls)])
|
||||||
|
(for-each1 f ($car ls) d (len d d 0)))]
|
||||||
|
[(null? ls) (void)]
|
||||||
|
[else (error who "improper list")])]
|
||||||
|
[(f ls ls2)
|
||||||
|
(unless (procedure? f)
|
||||||
|
(error who "~s is not a procedure" f))
|
||||||
|
(cond
|
||||||
|
[(pair? ls)
|
||||||
|
(if (pair? ls2)
|
||||||
|
(let ([d ($cdr ls)])
|
||||||
|
(for-each2 f
|
||||||
|
($car ls) ($car ls2) d ($cdr ls2) (len d d 0)))
|
||||||
|
(error who "length mismatch"))]
|
||||||
|
[(null? ls)
|
||||||
|
(if (null? ls2)
|
||||||
|
(void)
|
||||||
|
(error who "length mismatch"))]
|
||||||
|
[else (error who "not a list")])]
|
||||||
|
[_ (error who "vararg not supported yet")])))
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue