prelude.scm (4650B)
1 ;; Prelude — helpers promoted out of lisp.M1 into Scheme for 2 ;; reviewability. Prepended to every user script by the Makefile 3 ;; (cat src/prelude.scm $user.scm > combined.scm) so these names 4 ;; are in scope before user code runs. 5 ;; 6 ;; Only fixed-arity helpers live here — variadic lambdas aren't yet 7 ;; supported by env_extend, so list/append/min/max stay as P1 primitives. 8 9 ;; --- Boolean / logical ---------------------------------------------- 10 (define not 11 (lambda (x) (if x #f #t))) 12 13 ;; --- Arithmetic helpers (derivable from <, =, -) -------------------- 14 (define <= 15 (lambda (x y) (if (< y x) #f #t))) 16 17 (define >= 18 (lambda (x y) (if (< x y) #f #t))) 19 20 (define zero? 21 (lambda (x) (= x 0))) 22 23 (define negative? 24 (lambda (x) (< x 0))) 25 26 (define positive? 27 (lambda (x) (> x 0))) 28 29 (define abs 30 (lambda (x) (if (< x 0) (- 0 x) x))) 31 32 ;; --- Common c*r compositions --------------------------------------- 33 (define caar (lambda (x) (car (car x)))) 34 (define cadr (lambda (x) (car (cdr x)))) 35 (define cdar (lambda (x) (cdr (car x)))) 36 (define cddr (lambda (x) (cdr (cdr x)))) 37 (define caddr (lambda (x) (car (cdr (cdr x))))) 38 39 ;; --- List helpers (derivable from cons/car/cdr/null?/pair?/eq?) ----- 40 (define list? 41 (lambda (x) 42 (if (null? x) 43 #t 44 (if (pair? x) (list? (cdr x)) #f)))) 45 46 (define length-helper 47 (lambda (xs acc) 48 (if (null? xs) acc (length-helper (cdr xs) (+ acc 1))))) 49 50 (define length 51 (lambda (xs) (length-helper xs 0))) 52 53 (define reverse-helper 54 (lambda (xs acc) 55 (if (null? xs) acc (reverse-helper (cdr xs) (cons (car xs) acc))))) 56 57 (define reverse 58 (lambda (xs) (reverse-helper xs (quote ())))) 59 60 (define list-ref 61 (lambda (xs n) 62 (if (= n 0) (car xs) (list-ref (cdr xs) (- n 1))))) 63 64 (define assoc 65 (lambda (key alist) 66 (if (null? alist) 67 #f 68 (if (eq? (car (car alist)) key) 69 (car alist) 70 (assoc key (cdr alist)))))) 71 72 (define member 73 (lambda (x xs) 74 (if (null? xs) 75 #f 76 (if (eq? (car xs) x) 77 xs 78 (member x (cdr xs)))))) 79 80 ;; --- map / filter / fold / for-each --------------------------------- 81 (define map 82 (lambda (f xs) 83 (if (null? xs) 84 (quote ()) 85 (cons (f (car xs)) (map f (cdr xs)))))) 86 87 (define filter 88 (lambda (p xs) 89 (if (null? xs) 90 (quote ()) 91 (if (p (car xs)) 92 (cons (car xs) (filter p (cdr xs))) 93 (filter p (cdr xs)))))) 94 95 (define fold 96 (lambda (f acc xs) 97 (if (null? xs) 98 acc 99 (fold f (f acc (car xs)) (cdr xs))))) 100 101 (define for-each 102 (lambda (f xs) 103 (if (null? xs) 104 (quote ()) 105 (begin 106 (f (car xs)) 107 (for-each f (cdr xs)))))) 108 109 ;; --- Vector <-> list (derivable from make-vector/vector-ref/set) ---- 110 (define vector->list-helper 111 (lambda (v i acc) 112 (if (< i 0) 113 acc 114 (vector->list-helper v (- i 1) (cons (vector-ref v i) acc))))) 115 116 (define vector->list 117 (lambda (v) 118 (vector->list-helper v (- (vector-length v) 1) (quote ())))) 119 120 (define list->vector-helper 121 (lambda (v xs i) 122 (if (null? xs) 123 v 124 (begin 125 (vector-set! v i (car xs)) 126 (list->vector-helper v (cdr xs) (+ i 1)))))) 127 128 (define list->vector 129 (lambda (xs) 130 (list->vector-helper (make-vector (length xs) 0) xs 0))) 131 132 ;; --- Structural equality -------------------------------------------- 133 ;; equal? — eq? fast-path, then recurse into pairs, string contents, 134 ;; and vector elements. No cycle detection (matches the pre-move P1 135 ;; version's policy). 136 (define equal?-string 137 (lambda (a b i n) 138 (if (= i n) 139 #t 140 (if (= (string-ref a i) (string-ref b i)) 141 (equal?-string a b (+ i 1) n) 142 #f)))) 143 144 (define equal?-vector 145 (lambda (a b i n) 146 (if (= i n) 147 #t 148 (if (equal? (vector-ref a i) (vector-ref b i)) 149 (equal?-vector a b (+ i 1) n) 150 #f)))) 151 152 (define equal? 153 (lambda (a b) 154 (if (eq? a b) 155 #t 156 (if (pair? a) 157 (if (pair? b) 158 (if (equal? (car a) (car b)) 159 (equal? (cdr a) (cdr b)) 160 #f) 161 #f) 162 (if (string? a) 163 (if (string? b) 164 (if (= (string-length a) (string-length b)) 165 (equal?-string a b 0 (string-length a)) 166 #f) 167 #f) 168 (if (vector? a) 169 (if (vector? b) 170 (if (= (vector-length a) (vector-length b)) 171 (equal?-vector a b 0 (vector-length a)) 172 #f) 173 #f) 174 #f))))))