From: arthur miller <arthur.miller@live.com>
To: "Alfred M. Szmidt" <ams@gnu.org>,
Joost Kremers <joostkremers@fastmail.fm>
Cc: "eliz@gnu.org" <eliz@gnu.org>,
"yuri.v.khan@gmail.com" <yuri.v.khan@gmail.com>,
"emacs-devel@gnu.org" <emacs-devel@gnu.org>
Subject: Sv: Is this a bug in while-let or do I missunderstand it?
Date: Sun, 10 Nov 2024 19:49:00 +0000 [thread overview]
Message-ID: <DU2PR02MB10109373D5E48CFFBD2618000965F2@DU2PR02MB10109.eurprd02.prod.outlook.com> (raw)
In-Reply-To: <E1tA6lu-0001xR-2S@fencepost.gnu.org>
[-- Attachment #1: Type: text/plain, Size: 5661 bytes --]
> @defmac while-let spec then-forms...
> Like @code{when-let*}, but repeat until a binding in @var{spec} is
> @code{nil}. The return value is always @code{nil}.
>
>The "Like FOO" is confusing -- it is not like when-let*, when-let* is
>also not like let*. E.g., when spec is (binding value) or just
>(value) (!?) -- which should be mentioned in the manual.
>
>These foo-LET are are mixing up the condition being tested and the
>binding, when there is no binding the form seems to be just a test as
>if you'd pass it directly to WHEN (or whatever). There should be some
>example that SPEC is not at all like in LET, and that:
>
>(when-let* ((result1 (do-computation))
> ( (do-more result1)))
> (do-something result1))
>
>is something like (I guess?):
>
>(let ((result1 (do-computation)))
> (when result1
> (when (do-more result1)
> (do-something result2))))
>
>And these mentions of "Like LET*" should be removed entierly.
>
>But this is a better, and a good start.
>
> @code{while-let} replaces a common pattern in which a binding is
> established outside the @{while}-loop, tested as part of the condition of
> @{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
>
> The binding of @code{result} is reestablished at every iteration, therefore
> setting the value of @code{result} inside the loop has no effect. In order
> to end the loop, @code{(do-computation)} should eventually return
> @code{nil}.
>
> This example uses a single binding for clarity, but obviously
> @code{while-let} can establish multiple bindings. The loop runs as long as
> all bindings are non-@code{nil}.
> @end defmac
> ```
>
> Am I mistaken or is `while-let` a bit like a do..until loop that some
> languages offer?
Isn't it also like named-let? But without the ability to call itself recursivey.
I haven't tried it yet, but seems like while-let is a special case of named-let,
an "anonymous named-let" with conditions passed as-they-are. In other words we could
generate while-let as named-let with gensym as the name? (if cl-lib was allowed in
subr.el so to say). I am not sure if I have done it correctly, probably not, but here
is a try:
(defmacro while-test (spec &rest body)
(declare (indent defun))
(let* ((name (gensym "while-let-"))
(bindings (if (and (consp spec) (symbolp (car spec)))
(list spec)
spec)))
`(named-let ,name ,spec
,@body
(if (not (and ,@(mapcar #'car bindings)))
nil
(,name ,@(mapcar #'cadr bindings))))))
________________________________
Från: Alfred M. Szmidt <ams@gnu.org>
Skickat: den 10 november 2024 13:10
Till: Joost Kremers <joostkremers@fastmail.fm>
Kopia: eliz@gnu.org <eliz@gnu.org>; arthur.miller@live.com <arthur.miller@live.com>; yuri.v.khan@gmail.com <yuri.v.khan@gmail.com>; emacs-devel@gnu.org <emacs-devel@gnu.org>
Ämne: Re: Is this a bug in while-let or do I missunderstand it?
@defmac while-let spec then-forms...
Like @code{when-let*}, but repeat until a binding in @var{spec} is
@code{nil}. The return value is always @code{nil}.
The "Like FOO" is confusing -- it is not like when-let*, when-let* is
also not like let*. E.g., when spec is (binding value) or just
(value) (!?) -- which should be mentioned in the manual.
These foo-LET are are mixing up the condition being tested and the
binding, when there is no binding the form seems to be just a test as
if you'd pass it directly to WHEN (or whatever). There should be some
example that SPEC is not at all like in LET, and that:
(when-let* ((result1 (do-computation))
( (do-more result1)))
(do-something result1))
is something like (I guess?):
(let ((result1 (do-computation)))
(when result1
(when (do-more result1)
(do-something result2))))
And these mentions of "Like LET*" should be removed entierly.
But this is a better, and a good start.
@code{while-let} replaces a common pattern in which a binding is
established outside the @{while}-loop, tested as part of the condition of
@{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
The binding of @code{result} is reestablished at every iteration, therefore
setting the value of @code{result} inside the loop has no effect. In order
to end the loop, @code{(do-computation)} should eventually return
@code{nil}.
This example uses a single binding for clarity, but obviously
@code{while-let} can establish multiple bindings. The loop runs as long as
all bindings are non-@code{nil}.
@end defmac
```
Am I mistaken or is `while-let` a bit like a do..until loop that some
languages offer?
--
Joost Kremers
Life has its moments
[-- Attachment #2: Type: text/html, Size: 16150 bytes --]
next prev parent reply other threads:[~2024-11-10 19:49 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-08 16:25 Is this a bug in while-let or do I missunderstand it? arthur miller
2024-11-08 19:23 ` Philip Kaludercic
2024-11-09 3:30 ` Sv: " arthur miller
2024-11-09 9:29 ` Yuri Khan
2024-11-09 13:03 ` Sv: " arthur miller
2024-11-09 13:15 ` Yuri Khan
2024-11-09 13:38 ` Sv: " arthur miller
2024-11-09 13:41 ` Yuri Khan
2024-11-09 13:47 ` Sv: " arthur miller
2024-11-09 14:04 ` Yuri Khan
2024-11-09 14:44 ` Sv: " arthur miller
2024-11-09 16:33 ` Alfred M. Szmidt
2024-11-09 16:44 ` Eli Zaretskii
2024-11-09 16:53 ` Eli Zaretskii
2024-11-09 17:33 ` Andreas Schwab
2024-11-09 18:07 ` [External] : " Drew Adams
2024-11-09 18:18 ` Alfred M. Szmidt
2024-11-09 20:02 ` Jens Schmidt
2024-11-09 20:38 ` Alfred M. Szmidt
2024-11-09 21:18 ` Joost Kremers
2024-11-10 11:44 ` Alfred M. Szmidt
2024-11-10 12:24 ` Better documentation for non-binding clauses of if-let and friends Jens Schmidt
2024-11-10 14:51 ` Sean Whitton
2024-11-10 16:58 ` Jens Schmidt
2024-11-11 10:03 ` Alfred M. Szmidt
2024-11-11 8:20 ` Alfred M. Szmidt
2024-11-09 19:32 ` Sv: [External] : Re: Is this a bug in while-let or do I missunderstand it? arthur miller
2024-11-09 22:36 ` Drew Adams
2024-11-09 22:53 ` Drew Adams
2024-11-14 21:50 ` John ff
2024-11-09 20:29 ` Sv: " arthur miller
2024-11-10 6:22 ` Eli Zaretskii
2024-11-10 10:40 ` Joost Kremers
2024-11-10 12:10 ` Alfred M. Szmidt
2024-11-10 19:49 ` arthur miller [this message]
2024-11-10 18:18 ` Sv: " arthur miller
2024-11-11 5:13 ` Yuri Khan
2024-11-11 8:49 ` Sv: " arthur miller
2024-11-11 12:23 ` tomas
2024-11-11 22:41 ` Joost Kremers
2024-11-12 12:19 ` Eli Zaretskii
2024-11-12 12:45 ` Joost Kremers
2024-11-12 14:34 ` Eli Zaretskii
2024-11-12 15:32 ` Joost Kremers
2024-11-12 23:45 ` Joost Kremers
2024-11-13 9:45 ` Sean Whitton
2024-11-13 9:56 ` Sean Whitton
2024-11-13 11:00 ` Joost Kremers
2024-11-13 12:17 ` Sean Whitton
2024-11-14 7:55 ` Eli Zaretskii
2024-11-14 8:21 ` Joost Kremers
2024-11-14 21:51 ` John ff
2024-11-14 21:52 ` John ff
2024-11-09 21:47 ` Sv: " Joost Kremers
2024-11-09 22:07 ` Sv: " arthur miller
2024-11-10 6:07 ` Andreas Schwab
-- strict thread matches above, loose matches on Subject: below --
2024-11-12 3:36 arthur miller
2024-11-12 8:30 ` Joost Kremers
2024-11-12 17:55 ` Alfred M. Szmidt
2024-11-12 23:21 ` Sv: " arthur miller
2024-11-12 23:31 ` Joost Kremers
2024-11-12 23:08 ` arthur miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DU2PR02MB10109373D5E48CFFBD2618000965F2@DU2PR02MB10109.eurprd02.prod.outlook.com \
--to=arthur.miller@live.com \
--cc=ams@gnu.org \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=joostkremers@fastmail.fm \
--cc=yuri.v.khan@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).