X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme-library.scm;h=62a7aa3513148f2bb39eaed311f2d7fb2d0297c4;hb=82b93d081309895fe1a8e446daad5b8a75896fa3;hp=207bb30062fe236189c9b49b402462b934af5255;hpb=480095585b96fbcc5a4fb58fb57188609aadb6e5;p=scheme.forth.jl.git diff --git a/scheme-library.scm b/scheme-library.scm index 207bb30..62a7aa3 100644 --- a/scheme-library.scm +++ b/scheme-library.scm @@ -21,13 +21,36 @@ (car lists) (join (car lists) (apply append (cdr lists)))))) +; Reverse the contents of a list +(define (reverse l) + (if (null? l) + () + (append (reverse (cdr l)) (list (car l))))) ;; LIBRARY FORMS -(define-macro (let value . body ) - (list (list 'lambda (list (car value)) body)) (cdr value)) + +(define-macro (while condition . body) + `(begin + (define (loop) + (if ,condition + (begin ,@body (loop)))) + (loop))) ;; TESTING +(define-macro (backwards . body) + (cons 'begin (reverse body))) + +(define method '(while (> counter 0) + (display counter) (newline) + (set! counter (- counter 1)))) + +(define (count) + (define counter 10) + (while (> counter 0) + (display counter) (newline) + (set! counter (- counter 1)))) + ; Basic iterative summation. Run this on large numbers to ; test garbage collection and tail-call optimization. (define (sum n)