From e50306f64e8c5889df1bdac1a08ea6904cfc7ac1 Mon Sep 17 00:00:00 2001 From: "Yann Esposito (Yogsototh)" Date: Thu, 3 Mar 2011 17:04:08 +0100 Subject: [PATCH] Standard library --- stdlib.lsp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 stdlib.lsp diff --git a/stdlib.lsp b/stdlib.lsp new file mode 100644 index 0000000..762df9f --- /dev/null +++ b/stdlib.lsp @@ -0,0 +1,51 @@ +(define (not x) (if x #f #t)) +(define (null? obj) (if (eqv? obj '()) #t #f)) +(define (list . objs) objs) +(define (id obj) obj) +(define (flip func) (lambda (arg1 arg2) (func arg2 arg1))) +(define (curry func arg1) (lambda (arg) (apply func (cons arg1 (list arg))))) +(define (compose f g) (lambda (arg) (f (apply g arg)))) +(define zero? (curry = 0)) +(define positive? (curry > 0)) +(define negative? (curry < 0)) +(define (odd? num) (= (mod num 2) 1)) +(define (even? num) (= (mod num 2) 0)) + +(define (foldr func end lst) + (if (null? lst) + end + (func (car lst) (foldr func end (cdr lst))))) + +(define (foldl func accum lst) + (if (null? lst) + accum + (fold1 func (func accum (car lst)) (cdr lst)))) + +(define fold foldl) +(define reduce fold) + +(define (unfold func init pred) + (if (pred init) + (cons init '()) + (cons init (unfold func (func init) pred)))) + +(define (sum . lst) (fold + 0 lst)) +(define (product . lst) (fold * 1 lst)) +(define (and . lst) (fold && #t lst)) +(define (or . lst) (fold || #f lst)) + +(define (max first . rest) (fold (lambda (old new) (if (> old new) old new)) first rest)) +(define (min first . rest) (fold (lambda (old new) (if (< old new) old new)) first rest)) +(define (length lst) (fold (lambda (x y) (+ x 1)) 0 lst)) +(define (reverse lst) (fold (flip cons) '() lst)) + +(define (mem-helper pred op) (lambda (acc next) (if (and (not acc) (pred (op next))) next acc))) +(define (memq obj lst) (fold (mem-helper (curry eq? obj) id) #f lst)) +(define (memv obj lst) (fold (mem-helper (curry eqv? obj) id) #f lst)) +(define (member obj lst) (fold (mem-helper (curry equal? obj) id) #f lst)) +(define (assq obj alist) (fold (mem-helper (curry eq? obj) car) #f alist)) +(define (assv obj alist) (fold (mem-helper (curry eqv? obj) car) #f alist)) +(define (assoc obj alist) (fold (mem-helper (curry equal? obj) car) #f alist)) + +(define (map func lst) (foldr (lambda (x y) (cons (func x) y)) '() lst)) +(define (filter pred lst) (foldr (lambda (x y) (if (pred x) (cons x y) y)) '() lst))