-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuiltins.l
85 lines (66 loc) · 1.51 KB
/
builtins.l
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
(define (fib-iter n a b)
(if (= n 0)
a
(fib-iter (- n 1) b (+ a b))))
(define (fib n)
(fib-iter n 0 1))
(define nil '())
(define (caar x)
(car (car x)))
(define (cadr x)
(car (cdr x)))
(define (cddr x)
(cdr (cdr x)))
(define (caaar x)
(car (car (car x))))
(define (caadr x)
(car (car (cdr x))))
(define (cadar x)
(car (cdr (car x))))
(define (cdaar x)
(cdr (car (car x))))
(define (caddr x)
(car (cdr (cdr x))))
(define (cdadr x)
(cdr (car (cdr x))))
(define (cddar x)
(cdr (cdr (car x))))
(define (cdddr x)
(cdr (cdr (cdr x))))
(define (length x)
(if (null? x)
0
(+ 1 (length (cdr x)))))
(define (reverse x)
(if (null? x)
'()
(append (reverse (cdr x)) (list (car x)))))
(define (list-tail list k)
(if (zero? k)
list
(list-tail (cdr list) (- k 1))))
(define (list-ref list k)
(if (= k 0)
(car list)
(list-ref (cdr list) (- k 1))))
(define (reduce op coll n)
(if (null? coll)
n
(op (car coll)
(reduce op (cdr coll) n))))
(define (map proc list &rest rest)
(define (map1 func coll)
(if (null? coll)
'()
(cons (func (car coll))
(map1 func (cdr coll)))))
(define (some-null? coll)
(if (pair? coll)
(or (null? (car coll))
(some-null? (cdr coll)))
#f))
(let ((lists (cons list rest)))
(if (some-null? lists)
'()
(cons (apply proc (map1 car lists))
(apply map (cons proc (map1 cdr lists)))))))