| Deutsch English Français Italiano |
|
<20250415053852.166@kylheku.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Kaz Kylheku <643-408-1753@kylheku.com>
Newsgroups: comp.lang.c
Subject: Re: Loops (was Re: do { quit; } else { })
Date: Tue, 15 Apr 2025 13:19:52 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 152
Message-ID: <20250415053852.166@kylheku.com>
References: <vspbjh$8dvd$1@dont-email.me>
<20250409142303.00004645@yahoo.com>
<87ikndqabc.fsf@nosuchdomain.example.com>
<20250410115501.000037a5@yahoo.com> <vt8ei8$2vn84$1@dont-email.me>
<20250410080629.532@kylheku.com> <vt94q5$3jjod$1@dont-email.me>
<vt9628$3hhr8$3@dont-email.me> <vtammh$174ev$1@dont-email.me>
<vtavn9$1dp7m$3@dont-email.me> <vtb8nv$1plb2$2@dont-email.me>
<vtba81$1qfbm$1@dont-email.me> <vtbc6o$1te2o$1@dont-email.me>
<vtbhjv$24api$1@dont-email.me> <vtbn2k$293r1$1@dont-email.me>
<vtc19j$2kqlj$1@dont-email.me> <87a58mqt2o.fsf@nosuchdomain.example.com>
<vtc7mp$2q5hr$1@dont-email.me> <vtcqf6$3j95s$1@dont-email.me>
<vtdh4q$b3kt$1@dont-email.me> <vtf7fe$1qtpg$1@dont-email.me>
<vtgfuf$31ug1$1@dont-email.me> <20250413072027.219@kylheku.com>
<vtgpce$39229$1@dont-email.me> <vti2ki$g23v$1@dont-email.me>
<vtin99$vu24$1@dont-email.me> <vtiuf0$18au8$1@dont-email.me>
<vtj97r$1i3v3$1@dont-email.me> <vtl166$36p6b$1@dont-email.me>
<vtlcg0$3f46a$2@dont-email.me>
Injection-Date: Tue, 15 Apr 2025 15:19:53 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="16520bcd085ba48f48bf86c676aa114c";
logging-data="3987935"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19zKG+RmMwG1e2zjXl2rvwO1/YmmY3w+nw="
User-Agent: slrn/pre1.0.4-9 (Linux)
Cancel-Lock: sha1:5Ezk7VVcn5oOO1hyv6Xl5AC45rQ=
Bytes: 6847
On 2025-04-15, bart <bc@freeuk.com> wrote:
> On 15/04/2025 08:17, Janis Papanagnou wrote:
>> and someone already posted another iteration type on linked lists
>>
>> for (node = list; node; node = node->next)
>
> These two I get, and I can tell you that they're all WHILE loops. To
> make make them tidier, I'd have fewer complaints about them if they
> instead looked like this:
>
> while (node = list; node; node = node->next)
That's mostly bike shedding. It could also have been called:
do (node = list; node; node = node->next)
loop (node = list; node; node = node->next)
Lisp called this kind of general variable stepping loop "do"
(do ((var1 init1 step1)
(var2 init1 step2)
...)
(until-this-is-true also-this ... yield-this-result)
do-this
and-this
...)
Naming things can be hard. The reason that the loop is called for
is that most instance of for have a focus on the specific variable
that is initialized, and the guard condition has to do with it
hitting some specific terminating value.
> So, you can optionally add extra elements to a while (x).
>
> It would be necessary to either define whether while(x; y) means while
> (; x; y) or while (x; y), or to always require either zero or two
> semicolons inside (...).
>
> That could have kept 'for' for how it works in other languages (the ones
> that haven't just blindly copied C's version!).
Common Lisp uses "for" to indicate several kinds of variable
stepping clauses inside the loop syntax, some of which are:
[4]> (loop for x in '(a b c)
for y = 1 then (1+ y)
for z = (* y 10)
with w = (* y 10)
collect (list x y z w))
((A 1 10 10) (B 2 20 10) (C 3 30 10))
When loop is used to simulate the classic Lisp do loop,
it's done with the "for var = init then step" clauses.
There is a "for var from N to M" clause, as well as "for var below N"
which goes from 0 to N-1.
Why the C for loop is called "for" is that it is oriented toward
variable stepping. The while part of it is just the termination test.
for (node = list, count = 0;
node;
node = node->next, count++)
...
While loops occur that are not focused on stepping specific variables:
while (!(*status_port & CTS)) { }
while (queue_empty(q))
cond_wait(&condvar, &mutex);
> Let me ask you this: what exactly is the point of the 'while' statement
> in C?
> Since it can always be trivially be written as:
> for (;cond;)
That is simply untidy looking.
If C had a preprocessor from the beginning, while could have ben defined as:
#define while(cond) for(;cond;)
There are still some reasons not to do that, and preprocessing
came later.
> It seems to that most use cases (initialise, check exit condition,
> change something that affects the letter), would suit 'for' better.
The new for can declare a variable. This is important in macros
because the loop header encloses the declaration, such that
it cannot accidentally tear away as a fragment of another
statement:
This macro:
#define step(type, var, from, to) for(type var = from; var <= to; var ++)
cannot be defined using while without issues.
#define step(type, var, from, to) type var = from; while (var <= to; var ++)
Yes; we can make a macro
#define whl(cond) for (;cond;)
>
> But since 'for' then becomes overloaded, there ought to be a dedicated
> feature for simple iteration.
Once the macro preprocessor was introduced, programmers met their
need for dedicated, simplified iteration constructs that way, albeit
imperfectly.
// step n for each node in list
list_for (n, list) { .... }
#define list_for(n, list) for (node n = list; n; n = n->next)
A lot of these kinds of macros have issues of hygiene; we wouldn't
want them in a standard header file. They serve well the specific
codebase they are in, and that's all that can be said for them.
>>> Suppose you see 'i <= N' as the condition; is that '<=' intentional, or
>>> is it a typo for '<'? It's impossible to tell.
>>
>> (This is nonsense.)
>
> You can't just say that without explanation. WHY it it nonsense? Take this:
>
> for (i=0 i<=N; ++i)
It isn't nonsense. Guard conditions in for loops have historically been a
source of off-by-one errors in C programming, which bears acknowledging.
> Most such loops iterate over 0..N-1 inclusive, so would need "<". So, in
> your opinion, is that <= a typo, or is the intention to iterate over
> 0..N inclusive (so N+1 iterations)?
Indeed in a "for i from 0 to n + 1" type construct, it is
vanishingly unlikely that n + 1 is a typo.
It may be wrong, but as a finger slip-up that the eyes didn't catch.
--
TXR Programming Language: http://nongnu.org/txr
Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
Mastodon: @Kazinator@mstdn.ca