; ArrowLISP base functions
; Copyright (C) 1998-2006 Nils M Holm. All rights reserved.
; See the file LICENSE of the ArrowLISP distribution
; for conditions of use.
(define base t)
'= ; export
(package base)
(define (null x) (eq x ()))
(define (id x) x)
(define (list . x) x)
(define (not a) (eq a :F))
(define (neq x y)
(eq (eq x y) :F))
(define (caaaar x) (car (car (car (car x)))))
(define (caaadr x) (car (car (car (cdr x)))))
(define (caadar x) (car (car (cdr (car x)))))
(define (caaddr x) (car (car (cdr (cdr x)))))
(define (cadaar x) (car (cdr (car (car x)))))
(define (cadadr x) (car (cdr (car (cdr x)))))
(define (caddar x) (car (cdr (cdr (car x)))))
(define (cadddr x) (car (cdr (cdr (cdr x)))))
(define (cdaaar x) (cdr (car (car (car x)))))
(define (cdaadr x) (cdr (car (car (cdr x)))))
(define (cdadar x) (cdr (car (cdr (car x)))))
(define (cdaddr x) (cdr (car (cdr (cdr x)))))
(define (cddaar x) (cdr (cdr (car (car x)))))
(define (cddadr x) (cdr (cdr (car (cdr x)))))
(define (cdddar x) (cdr (cdr (cdr (car x)))))
(define (cddddr x) (cdr (cdr (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 (caddr x) (car (cdr (cdr x))))
(define (cdaar x) (cdr (car (car x))))
(define (cdadr x) (cdr (car (cdr x))))
(define (cddar x) (cdr (cdr (car x))))
(define (cdddr x) (cdr (cdr (cdr x))))
(define (caar x) (car (car x)))
(define (cadr x) (car (cdr x)))
(define (cdar x) (cdr (car x)))
(define (cddr x) (cdr (cdr x)))
(define (reduce f a default)
(letrec
((_reduce (lambda (a res)
(cond ((null a) res)
(t (_reduce (cdr a)
(f res (car a))))))))
(cond ((null a) default)
(t (_reduce (cdr a) (car a))))))
(define (reduce-r f a default)
(letrec
((_reduce (lambda (a res)
(cond ((null a) res)
(t (_reduce (cdr a)
(f (car a) res)))))))
(cond ((null a) default)
(t (let ((ra (reverse a)))
(_reduce (cdr ra) (car ra)))))))
(define (reverse a)
(letrec
((_reverse (lambda (a b)
(cond ((null a) b)
(t (_reverse (cdr a) (cons (car a) b)))))))
(_reverse a ())))
(define (append . a)
(letrec
((append2 (lambda (a b)
(cond ((null a) b)
(t (append2 (cdr a) (cons (car a) b))))))
(_append (lambda (a b)
(cond ((null b) a)
(t (append2 (reverse a) b))))))
(reduce _append a ())))
(define (equal a b)
(cond
((or (atom a) (atom b))
(eq a b))
(t (and (equal (car a) (car b))
(equal (cdr a) (cdr b))))))
(define (assoc x a)
(letrec
((_assoc (lambda (a)
(cond ((null a) :F)
((equal (caar a) x) (car a))
(t (_assoc (cdr a)))))))
(_assoc a)))
(define (assq x a)
(letrec
((_assq (lambda (a)
(cond ((null a) :F)
((eq (caar a) x) (car a))
(t (_assq (cdr a)))))))
(_assq a)))
(define (listp x)
(or (null x)
(and (not (atom x))
(listp (cdr x)))))
(define (map f . a)
(letrec
((map-list (lambda (f a r)
(cond ((null a) (reverse r))
(t (map-list f (cdr a)
(cons (f (car a)) r))))))
(carof (lambda (a)
(map-list car a ())))
(cdrof (lambda (a)
(map-list cdr a ())))
(any-null (lambda (a)
(apply or (map-list null a ()))))
(_map (lambda (a b)
(cond ((any-null a) (reverse b))
(t (_map (cdrof a)
(cons (apply f (carof a)) b)))))))
(cond ((null a)
(bottom '(too few arguments to map)))
(t (_map a ())))))
(define (member x a)
(letrec
((_member (lambda (a)
(cond ((null a) :F)
((equal (car a) x) a)
(t (_member (cdr a)))))))
(_member a)))
(define (memq x a)
(letrec
((_memq (lambda (a)
(cond ((null a) :F)
((eq (car a) x) a)
(t (_memq (cdr a)))))))
(_memq a)))
(define (require x)
(letrec
((req (lambda (sym file)
(cond ((defined sym) :F)
(t (apply load (list file)))))))
(let ((xx (explode x)))
(cond ((eq (car xx) '=)
(req (implode (cdr xx)) x))
(t (req x x))))))
(define (export . symbols) t)
(package)
syntax highlighted by Code2HTML, v. 0.9.1