X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=scheme.forth.jl.git;a=blobdiff_plain;f=scheme-library.scm;h=5ee0b49c2c7e88b4bfb4a922df27b4dd52e70a03;hp=1a68a10d43a56e08ad417787677fe2629f3809d7;hb=55761030cc43072bbc8b2d1ef5a053fc64a6a3ec;hpb=fa6316fc696ddda325b2e2a8af83f4024ddf32bd diff --git a/scheme-library.scm b/scheme-library.scm index 1a68a10..5ee0b49 100644 --- a/scheme-library.scm +++ b/scheme-library.scm @@ -7,6 +7,12 @@ (define (null? args) (eq? args ())) +(define (caar l) (car (car l))) +(define (cadr l) (car (cdr l))) +(define (cdar l) (cdr (car l))) +(define (cddr l) (cdr (cdr l))) +(define (cadar l) (car (cdr (car l)))) + ; Join two lists together (define (join l1 l2) (if (null? l1) @@ -29,12 +35,32 @@ ;; LIBRARY FORMS + +; let + +(define (let-vars args) + (if (null? args) + '() + (cons (caar args) (let-vars (cdr args))))) + +(define (let-inits args) + (if (null? args) + '() + (cons (cadar args) (let-inits (cdr args))))) + +(define-macro (let args . body) + `((lambda ,(let-vars args) + ,@body) ,@(let-inits args))) + +; while + (define-macro (while condition . body) + (define loop (gensym)) `(begin - (define (loop) + (define (,loop) (if ,condition - (begin ,@body (loop)))) - (loop))) + (begin ,@body (,loop)))) + (,loop))) ;; TESTING