;;; Alef Lazily Evaluates Functions ;;; (C) 2008-2009 Dr. Gergo ERDI (in-package :alef) (defparameter *library-decls* '(; Arithmetics (declare/virtual (+ a) () (a a a)) (declare/virtual (- a) () (a a a)) (declare/virtual (* a) () (a a a)) (declare/virtual (/ a) () (a a a)) (declare/virtual (= a) () (a a bool)) (declare/virtual (< a) () (a a bool)) ; Conversion to string (declare/virtual (show a) () (a string)))) (defparameter *library-native* '((define/override (+ int) (x y) (+/int x y)) (define/override (- int) (x y) (-/int x y)) (define/override (* int) (x y) (*/int x y)) (define/override (/ int) (x y) (//int x y)) (define/override (= int) (x y) (=/int x y)) (define/override (< int) (x y) ( (x y) (< y x)) (define >= (x y) (<= y x)) (deftype list (t) nil (cons t (list t))) (define length (nil) 0) (define length ((cons _ xs)) (+ 1 (length xs))) (define take (0 _) nil) (define take (_ nil) nil) (define take (k (cons x xs)) (cons x (take (- k 1) xs))) (define drop (0 xs) xs) (define drop (k nil) nil) (define drop (k (cons x xs)) (drop (- k 1) xs)) (define map (f nil) nil) (define map (f (cons x xs)) (cons (f x) (map f xs))) (define filter (p nil) nil) (define filter (p (cons x xs)) (if (p x) (cons x (filter p xs)) (filter p xs))) (define append (xs nil) xs) (define append (nil ys) ys) (define append ((cons x xs) ys) (cons x (append xs ys))) (define concat (nil) nil) (define concat ((cons x xs)) (append x (concat xs))) (define show/list* (nil _) ("]")) (define show/list* (l false) (+/string "," (show/list* l true))) (define show/list* ((cons x xs) true) (+/string (show x) (show/list* xs false))) (define show/list (l) (+/string "[" (show/list* l true))) (define/override (show list) (l) (show/list l))))