blob: 4cb8100dcace4b080b42cf4964711dd6a3f37f01 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
;; standard library for bs
(define (not x) (if x #f #t))
(define (null? obj) (if (eqv? obj '()) #t #f))
(define (list objs) objs)
(define (identity obj) obj)
(define (flip f) (lambda (x y) (f y x)))
(define (curry f a) (lambda (b) (apply f (cons a (list b)))))
(define (compose f g) (lambda (x) (f (apply g x))))
(define zero? (curry = 0))
(define positive? (curry < 0))
(define negative? (curry > 0))
(define (odd? n) (= (mod n 2) 1))
(define (even? n) (= (mod n 2) 0))
(define (foldr f end lst)
(if (null? lst)
end
(f (car lst) (foldr f end (cdr lst)))))
(define (foldl f acc lst)
(if (null? lst)
acc
(foldl f (f acc (car lst)) (cdr lst))))
(define fold foldl)
(define reduce foldr)
(define (unfold f init pred)
(if (pred init)
(cons init '())
(cons init (unfold f (f init) pred))))
(define (mem* pred op)
(lambda (acc next)
(if (and (not acc) (pred (op next)))
next
acc)))
(define (sum lst) (fold + 0 lst))
(define (produce lst) (fold * 0 1 lst))
(define (max nums)
(fold (lambda (x y) (if (> x y) x y))
(car nums) (cdr nums)))
(define (min nums)
(fold (lambda (x y) (if (< x y) x y))
(car nums) (cdr nums)))
(define (length lst) (fold (lambda (x y) (+ x 1)) 0 lst))
(define (reverse lst) (fold (flip cons) '() lst))
(define (memq obj lst) (fold (mem* (curry eq? obj) identity) #f lst))
(define (memv obj lst) (fold (mem* (curry eqv? obj) identity) #f lst))
(define (member obj lst) (fold (mem* (curry equal? obj) identity) #f lst))
(define (assq obj alist) (fold (mem* (curry eq? obj) car) #f alist))
(define (assv obj alist) (fold (mem* (curry eqv? obj) car) #f alist))
(define (assoc obj alist) (fold (mem* (curry equal? obj) car) #f alist))
(define (map f lst) (foldr (lambda (x y) (cons (f x) y)) '() lst))
(define (filter pred lst) (foldr (lambda (x y) (if (pred x) (cons x y) y)) '() lst))
|