diff --git a/scm.mes b/scm.mes index 3074b093..80e69098 100755 --- a/scm.mes +++ b/scm.mes @@ -62,10 +62,19 @@ (#t (split-values (cdr bindings) (append values (cdar bindings) '()))))) -(define-macro (let bindings . body) - `((lambda ,(split-params bindings '()) ,@body) +(define-macro (simple-let bindings rest) + `((lambda ,(split-params bindings '()) ,@rest) ,@(split-values bindings '()))) +(define-macro (let-loop label bindings rest) + `(let ((,label (lambda ,(split-params bindings '()) ,@rest))) + (,label ,@(split-values bindings '())))) + +(define-macro (let bindings-or-label . rest) + `(if ,(symbol? bindings-or-label) + (let-loop ,bindings-or-label ,(car rest) ,(cdr rest)) + (simple-let ,bindings-or-label ,rest))) + (define (expand-let* bindings body) (cond ((null? bindings) `((lambda () ,@body))) diff --git a/test.mes b/test.mes index 8b1bf304..6bd118c7 100644 --- a/test.mes +++ b/test.mes @@ -81,6 +81,17 @@ (display 'let-dun) (newline) +(let loop ((lst '(3 2 1))) + (display "loop") + (newline) + (if (null? lst) (begin (display "dun") 'dun) + (begin + (display "looping: ") + (display (car lst)) + (newline) + (loop (cdr lst))))) +(newline) + (define c 'b) `(aa bb ,c) (display `(pp qq ,c))