;; Sample pre-defined Scheme operations on booleans:

(define myboolean?
  (lambda (x)
    (or (eq? x #t) (eq? x #f))))

(define mynot
  (lambda (x)
    (if x #f #t)))

(define mynot-typechecked
  (lambda (x)
    (if (boolean? x)
	(if x #f #t)
	(display "Type error"))))

;; e.g:

(myboolean? (= 0 2))
(mynot (myboolean? mynot))

;; Booleans in pure lambda calculus (normal order)

(define mytrue
  (lambda (x y)
    x))

(define myfalse
  (lambda (x y)
    y))

(define myif
  (lambda (x t f)
    (x t f)))

;; e.g.:

(myif mytrue 4 5)

(myif myfalse 4 5)


;; Sample pre-defined Scheme operations on numbers

(define my*
  (lambda (x y)
    (if (= x 0)
	0
	(+ y (my* (- x 1) y)))))


;; Sample pre-defined Scheme operations on characters

(define mychar-whitespace?
  (lambda (x)
    (or (char=? x #\space)
	(char=? x #\tab)
	(char=? x #\newline))))

;; Sample pre-defined Scheme operations on lists

(define myappend
  (lambda (x y)
    (if (null? x)
	y
	(cons (car x) (myappend (cdr x) y)))))
