boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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))))))