From e3c83a7cd3618a87d74e58973dcd82e560e2da97 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sun, 3 Sep 2017 23:29:11 +0200 Subject: memoization: (mlambda () ...) allows for inner 'define'. Previously (mlambda () (define foo 2) bar) would trigger a syntax error. * guix/memoization.scm (%mlambda): In the zero-argument case, move BODY... to a lambda to allow for inner 'define' and such. --- guix/memoization.scm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'guix/memoization.scm') diff --git a/guix/memoization.scm b/guix/memoization.scm index 5cae283610..bf3b73d806 100644 --- a/guix/memoization.scm +++ b/guix/memoization.scm @@ -76,10 +76,11 @@ (define-syntax %mlambda exactly one value." ((_ cached () body ...) ;; The zero-argument case is equivalent to a promise. - (let ((result #f) (cached? #f)) + (let ((result #f) (cached? #f) + (compute (lambda () body ...))) (lambda () (unless cached? - (set! result (begin body ...)) + (set! result (compute)) (set! cached? #t)) result))) -- cgit v1.2.3