summaryrefslogtreecommitdiff
path: root/prelude/primitives.scm
blob: 96dd1dd37c1e2975b0912de66a5ee49413f1159e (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
(define (true? expr) (eq? expr 'true))
(define (false? expr) (eq? expr 'false))
(define (bool? expr)
  (or (true? expr)
      (false? expr)))

(define (and-special . items)
  (if (null? items)
      'false
      (let ([first (car items)])
        (cond
          [(true? first) (apply and-special (cdr items))]
          [(false? first) 'false]
          [else (error "AND: unable to evaluate non-boolean form" first)]))))

(define (or-special . items)
  (if (null? items)
      'false
      (let ([first (car items)])
        (cond
          [(true? first) 'true]
          [(false? first) (apply or-special (cdr items))]
          [else (error "OR: unable to evaluate non-boolean form" first)]))))

(define (not-fn x) (not (true? x)))

(define primitives
  `((+ . ,+)
    (- . ,-)
    (* . ,*)
    (&& . ,and-special)
    (|| . ,or-special)
    (/= . ,not-fn)))

(define (primitive-names) (map car primitives))
(define (primitive-objs) (map cdr primitives))