implement some of important list functions listed on srfi-1
This commit is contained in:
parent
78d82e4d12
commit
dd784c589b
|
@ -5,12 +5,20 @@
|
||||||
;; cons list
|
;; cons list
|
||||||
;; xcons cons* make-list list-tabulate
|
;; xcons cons* make-list list-tabulate
|
||||||
;; list-copy circular-list iota
|
;; list-copy circular-list iota
|
||||||
|
(define (xcons a b)
|
||||||
|
(cons b a))
|
||||||
|
|
||||||
|
(export cons list xcons)
|
||||||
|
|
||||||
;; # Predicates
|
;; # Predicates
|
||||||
;; pair? null?
|
;; pair? null?
|
||||||
;; proper-list? cirtular-list? dotted-list?
|
;; proper-list? cirtular-list? dotted-list?
|
||||||
;; not-pair? null-list?
|
;; not-pair? null-list?
|
||||||
;; list=
|
;; list=
|
||||||
|
(define (not-pair? x)
|
||||||
|
(not (pair? x)))
|
||||||
|
|
||||||
|
(export pair? null? not-pair?)
|
||||||
|
|
||||||
;; # Selectors
|
;; # Selectors
|
||||||
;; car cdr ... cddadr cddddr list-ref
|
;; car cdr ... cddadr cddddr list-ref
|
||||||
|
@ -21,6 +29,25 @@
|
||||||
;; take! drop-right!
|
;; take! drop-right!
|
||||||
;; split-at split-at!
|
;; split-at split-at!
|
||||||
;; last last-pair
|
;; last last-pair
|
||||||
|
(define (car+cdr pair)
|
||||||
|
(values (car pair) (cdr pair)))
|
||||||
|
|
||||||
|
(define (take x i)
|
||||||
|
(if (zero? i)
|
||||||
|
'()
|
||||||
|
(cons (car x)
|
||||||
|
(take (cdr x) (- i 1)))))
|
||||||
|
|
||||||
|
(define (drop x i)
|
||||||
|
(if (zero? i)
|
||||||
|
x
|
||||||
|
(drop (cdr x) (- i 1))))
|
||||||
|
|
||||||
|
(define (split-at x i)
|
||||||
|
(values (take x i) (drop x i)))
|
||||||
|
|
||||||
|
(export car cdr car+cdr
|
||||||
|
take drop)
|
||||||
|
|
||||||
;; # Miscellaneous
|
;; # Miscellaneous
|
||||||
;; length length+
|
;; length length+
|
||||||
|
@ -29,6 +56,13 @@
|
||||||
;; append-reverse append-reverse!
|
;; append-reverse append-reverse!
|
||||||
;; zip unzip1 unzip2 unzip3 unzip4 unzip5
|
;; zip unzip1 unzip2 unzip3 unzip4 unzip5
|
||||||
;; count
|
;; count
|
||||||
|
(define (concatenate lists)
|
||||||
|
(apply append lists))
|
||||||
|
|
||||||
|
(define (zip . lists)
|
||||||
|
(apply map list lists))
|
||||||
|
|
||||||
|
(export length append concatenate reverse zip)
|
||||||
|
|
||||||
;; # Fold, unfold & map
|
;; # Fold, unfold & map
|
||||||
;; map for-each
|
;; map for-each
|
||||||
|
@ -36,10 +70,27 @@
|
||||||
;; fold-right unfold-right pair-fold right reduce-right
|
;; fold-right unfold-right pair-fold right reduce-right
|
||||||
;; append-map append-map!
|
;; append-map append-map!
|
||||||
;; map! pair-for-each filter-map map-in-order
|
;; map! pair-for-each filter-map map-in-order
|
||||||
|
(export map for-each)
|
||||||
|
|
||||||
;; # Filtering & partitioning
|
;; # Filtering & partitioning
|
||||||
;; filter partition remove
|
;; filter partition remove
|
||||||
;; filter! partition! remove!
|
;; filter! partition! remove!
|
||||||
|
(define (filter pred list)
|
||||||
|
(if (null? list)
|
||||||
|
'()
|
||||||
|
(if (pred (car list))
|
||||||
|
(cons (car list)
|
||||||
|
(filter pred (cdr list)))
|
||||||
|
(filter pred (cdr list)))))
|
||||||
|
|
||||||
|
(define (partition pred list)
|
||||||
|
(values (filter pred list)
|
||||||
|
(filter (lambda (x) (not (pred x))) list)))
|
||||||
|
|
||||||
|
(define (remove pred list)
|
||||||
|
(filter (lambda (x) (not (pred x))) list))
|
||||||
|
|
||||||
|
(export filter partition remove)
|
||||||
|
|
||||||
;; # Searching
|
;; # Searching
|
||||||
;; member memq memv
|
;; member memq memv
|
||||||
|
@ -48,6 +99,20 @@
|
||||||
;; list-index
|
;; list-index
|
||||||
;; take-while drop-while take-while!
|
;; take-while drop-while take-while!
|
||||||
;; span break span! break!
|
;; span break span! break!
|
||||||
|
(define (find-tail pred list)
|
||||||
|
(if (null? list)
|
||||||
|
#f
|
||||||
|
(if (pred (car list))
|
||||||
|
list
|
||||||
|
(find-tail pred (cdr list)))))
|
||||||
|
|
||||||
|
(define (find pred list)
|
||||||
|
(let ((tail (find-tail pred list)))
|
||||||
|
(if tail
|
||||||
|
(car tail)
|
||||||
|
#f)))
|
||||||
|
|
||||||
|
(export member memq memv find-tail find)
|
||||||
|
|
||||||
;; # Deleting
|
;; # Deleting
|
||||||
;; delete delete-duplicates
|
;; delete delete-duplicates
|
||||||
|
@ -57,6 +122,7 @@
|
||||||
;; assoc assq assv
|
;; assoc assq assv
|
||||||
;; alist-cons alist-copy
|
;; alist-cons alist-copy
|
||||||
;; alist-delete alist-delete!
|
;; alist-delete alist-delete!
|
||||||
|
(export assoc assq assv)
|
||||||
|
|
||||||
;; # Set operations on lists
|
;; # Set operations on lists
|
||||||
;; lset<= lset= lset-adjoin
|
;; lset<= lset= lset-adjoin
|
||||||
|
@ -68,4 +134,4 @@
|
||||||
|
|
||||||
;; # Primitive side-effects
|
;; # Primitive side-effects
|
||||||
;; set-car! set-cdr!
|
;; set-car! set-cdr!
|
||||||
)
|
(export set-car! set-cdr!))
|
||||||
|
|
Loading…
Reference in New Issue