summaryrefslogtreecommitdiff
path: root/lore/core.scm
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))