|
From: | arthur miller |
Subject: | Re: Is this a bug in while-let or do I missunderstand it? |
Date: | Tue, 12 Nov 2024 03:36:11 +0000 |
>+@code{while-let} replaces a pattern in which a binding is established
>+outside the @code{while}-loop, tested as part of the condition of
>+@code{while} and subsequently changed inside the loop using the same
>+_expression_ that it was originally bound to:
>+
>+@example
>+(let ((result (do-computation)))
>+ (while result
>+ (do-stuff-with result)
>+ (setq result (do-computation))))
>+@end example
>+
>+Using @code{while-let}, this can be written more succinctly as:
>+
>+@example
>+(while-let ((result (do-computation)))
>+ (do-stuff-with result))
>+@end example
>+
>+One crucial difference here is the fact that in the first code example,
>+@code{result} is scoped outside the @code{wile} loop, whereas in the
>+second example, its scope is confined to the @code{while-let} loop. As
>+a result, changing the value of @code{result} inside the loop has no
>+effect on the subsequent iteration.
>+@end defmac
The scope of the let-binding is the same in both. The crucial
difference is that in the first example, the user have control over
when and how 'result' is evaluated. The user can for example do:
(let ((result (do-computation)))
(while result
(do-stuff-with result)
(setq result (do-some-other-computation))))
Whereas in the other example, the code is automatically generated
to pass in the original condition calculation, and the user can not
interfere with the computation of the condition.
|
[Prev in Thread] | Current Thread | [Next in Thread] |