aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2019-04-05 18:15:05 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2019-04-05 18:15:05 +0200
commit2876e0b6dda45b41e1f8d88b748b30fe3c69e971 (patch)
tree4cd63a87e91f22472d3c07160d4a28d9ac849911
parentAdd enumerate and map-each. (diff)
downloadcalp-2876e0b6dda45b41e1f8d88b748b30fe3c69e971.tar.gz
calp-2876e0b6dda45b41e1f8d88b748b30fe3c69e971.tar.xz
Add extra case to let*.
-rw-r--r--module/util.scm5
-rw-r--r--tests/let.scm4
2 files changed, 9 insertions, 0 deletions
diff --git a/module/util.scm b/module/util.scm
index bf7d746d..1a7c5471 100644
--- a/module/util.scm
+++ b/module/util.scm
@@ -123,6 +123,11 @@
(lambda (k k* ...)
(let* (rest ...)
body ...)))]
+
+ ;; Declare variable without a value (actuall #f).
+ ;; Useful for inner mutation.
+ [(_ (v rest ...) body ...)
+ (let* ((v #f) rest ...) body ...)]
))
(define (improper->proper-list lst len)
diff --git a/tests/let.scm b/tests/let.scm
index 21b23754..53f39e4c 100644
--- a/tests/let.scm
+++ b/tests/let.scm
@@ -10,5 +10,9 @@
(test-assert (let* (((a) '(#t))) a))
(test-equal '(2) (let* (((a . b) '(1 2))) b))
(test-equal '(3 4) (let* (((a b . c) '(1 2 3 4))) c))
+(test-equal 10 (let* (x) (set! x 10) x))
+(test-equal 30 (let* (x y) (set! x 10) (set! y 20) (+ x y)))
+(test-assert (let* (x) (not x)))
+(test-equal 6 (let* ((x 1) y z) (set! y 2) (set! z 3) (+ x y z)))
(test-end "let")