X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme-library.scm;h=f95ed65595fc71e5cf24ef5ef4edf492ad8e1d63;hb=a95efe1cb2d3774471bb9c0fe4628abe09032ca6;hp=5ee0b49c2c7e88b4bfb4a922df27b4dd52e70a03;hpb=55761030cc43072bbc8b2d1ef5a053fc64a6a3ec;p=scheme.forth.jl.git diff --git a/scheme-library.scm b/scheme-library.scm index 5ee0b49..f95ed65 100644 --- a/scheme-library.scm +++ b/scheme-library.scm @@ -33,8 +33,8 @@ () (append (reverse (cdr l)) (list (car l))))) -;; LIBRARY FORMS +;; LIBRARY SPECIAL FORMS ; let @@ -55,12 +55,70 @@ ; while (define-macro (while condition . body) - (define loop (gensym)) - `(begin - (define (,loop) - (if ,condition - (begin ,@body (,loop)))) - (,loop))) + (let ((loop (gensym))) + `(begin + (define (,loop) + (if ,condition + (begin ,@body (,loop)))) + (,loop)))) + +; cond + +(define (cond-predicate clause) (car clause)) +(define (cond-actions clause) (cdr clause)) +(define (cond-else-clause? clause) + (eq? (cond-predicate clause) 'else)) + +(define (expand-clauses clauses) + (if (null? clauses) + (none) + (let ((first (car clauses)) + (rest (cdr clauses))) + (if (cond-else-clause? first) + (if (null? rest) + `(begin ,@(cond-actions first)) + (error "else clause isn't last in cond expression.")) + `(if ,(cond-predicate first) + (begin ,@(cond-actions first)) + ,(expand-clauses rest)))))) + +(define-macro (cond . clauses) + (if (null? clauses) + (error "cond requires at least one clause.") + (expand-clauses clauses))) + +; and + +(define (expand-and-expressions expressions) + (let ((first (car expressions)) + (rest (cdr expressions))) + (if (null? rest) + first + `(if ,first + ,(expand-and-expressions rest) + #f)))) + +(define-macro (and . expressions) + (if (null? expressions) + #t + (expand-and-expressions expressions))) + +; or + +(define (expand-or-expressions expressions) + (if (null? expressions) + #f + (let ((first (car expressions)) + (rest (cdr expressions)) + (val (gensym))) + `(let ((,val ,first)) + (if ,val + ,val + ,(expand-or-expressions rest)))))) + +(define-macro (or . expressions) + (expand-or-expressions expressions)) + ;; TESTING