X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme-library.scm;h=f95ed65595fc71e5cf24ef5ef4edf492ad8e1d63;hb=a95efe1cb2d3774471bb9c0fe4628abe09032ca6;hp=ffe02ea14b441741b8b4b90a98dc6f01a40e4e30;hpb=1d07170e70db6f42a900ea918ac22cce65345f2f;p=scheme.forth.jl.git diff --git a/scheme-library.scm b/scheme-library.scm index ffe02ea..f95ed65 100644 --- a/scheme-library.scm +++ b/scheme-library.scm @@ -87,6 +87,39 @@ (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 (define-macro (backwards . body)