| Thread overview | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
June 02, 2014 for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
It is common in a recursive function to amend a global array using the function parameter to refer to the element eg
int[10];
void foo (int i) {
foreach (x; 0 .. 9) {
t[i] = x;
foo ();
C in a for loop allows use of t[i] directly as the iterating variable so you don't need the dummy variable x which has no real function.
D does not. The error generated is "no identifier for declarator t[i]". For a long time, I thought that was specific to foreach but the same thing happens with for.
It looks like an unnecessary restriction. Am I missing something?
| ||||
June 02, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Logesh Pillay | Of course, in the first line I meant to say int[10] t; | |||
June 02, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Logesh Pillay | On Mon, 02 Jun 2014 15:21:06 -0400, Logesh Pillay <lp.court.jester@gmail.com> wrote:
> It is common in a recursive function to amend a global array using the function parameter to refer to the element eg
>
> int[10];
>
> void foo (int i) {
> foreach (x; 0 .. 9) {
> t[i] = x;
> foo ();
>
> C in a for loop allows use of t[i] directly as the iterating variable so you don't need the dummy variable x which has no real function.
>
> D does not. The error generated is "no identifier for declarator t[i]". For a long time, I thought that was specific to foreach but the same thing happens with for.
>
> It looks like an unnecessary restriction. Am I missing something?
Can you post a full compiling example? I can't figure out what you are trying to do with this code.
-Steve
| |||
June 02, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Logesh Pillay | On Monday, 2 June 2014 at 19:21:07 UTC, Logesh Pillay wrote: > It is common in a recursive function to amend a global array using the function parameter to refer to the element eg > > int[10]; > > void foo (int i) { > foreach (x; 0 .. 9) { > t[i] = x; > foo (); > > C in a for loop allows use of t[i] directly as the iterating variable so you don't need the dummy variable x which has no real function. > > D does not. The error generated is "no identifier for declarator t[i]". For a long time, I thought that was specific to foreach but the same thing happens with for. > > It looks like an unnecessary restriction. Am I missing something? works fine for me: http://dpaste.dzfl.pl/6ff9a3909fde | |||
June 02, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | Issue has nothing to do with recursion. That's only where I keep seeing it.
eg a function to generate combinations.
import std.stdio;
int[3] t;
void foo (int i) {
if (i == 3)
writef("%s\n", t);
else foreach (x; 0 .. 3) {
t[i] = x;
foo(i+1);
}
}
void main() {
foo(0);
}
In C, I could put in the equivalent for statement for foreach, t[i] as the iterating variable. I won't need x which exists as a middleman only and save myself two lines.
| |||
June 02, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Logesh Pillay | On Mon, 02 Jun 2014 15:47:02 -0400, Logesh Pillay <lp.court.jester@gmail.com> wrote:
> Issue has nothing to do with recursion. That's only where I keep seeing it.
>
> eg a function to generate combinations.
>
> import std.stdio;
>
> int[3] t;
>
> void foo (int i) {
> if (i == 3)
> writef("%s\n", t);
> else foreach (x; 0 .. 3) {
> t[i] = x;
> foo(i+1);
> }
> }
>
> void main() {
> foo(0);
> }
>
> In C, I could put in the equivalent for statement for foreach, t[i] as the iterating variable. I won't need x which exists as a middleman only and save myself two lines.
OK, I get it. You want to do:
foreach(t[i]; 0 .. 3)
But this doesn't work.
This should (the equivalent for C):
for(t[i] = 0; t[i] < 3; ++t[i])
I'm trying to think of a way to do this without loops, but not sure. Note that foreach is expected to be given a new variable to declare, so you can't foreach with an existing variable on the left.
-Steve
| |||
June 02, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | Sorry, I am embarassed to say I've just tried the for equivalent and it works with t[i] as the iterating variable.
import std.stdio;
int[3] t;
void foo (int i) {
if (i == 3)
writef("%s\n", t);
else for (t[i] = 0; t[i] < 3; t[i]++)
foo(i+1);
}
void main() {
foo(0);
}
Sorry, yet another overhasty post
| |||
June 02, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Mon, 02 Jun 2014 15:58:01 -0400, Steven Schveighoffer <schveiguy@yahoo.com> wrote:
> I'm trying to think of a way to do this without loops, but not sure.
I'm surprised, I looked for some kind of "apply" function like map, but just calls some function with each element in the range.
Something like this would make this a 1 (2?) liner:
if(i == t.length) writeln(t) else each!((x) => {t[i] = x; foo(i+1);})(iota(x.length));
But I can't find a phobos primitive for each. Would have expected it in std.algorithm or std.functional?
-Steve
| |||
June 02, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Monday, 2 June 2014 at 20:23:12 UTC, Steven Schveighoffer wrote:
> On Mon, 02 Jun 2014 15:58:01 -0400, Steven Schveighoffer <schveiguy@yahoo.com> wrote:
>
>
>> I'm trying to think of a way to do this without loops, but not sure.
>
> I'm surprised, I looked for some kind of "apply" function like map, but just calls some function with each element in the range.
>
> Something like this would make this a 1 (2?) liner:
>
> if(i == t.length) writeln(t) else each!((x) => {t[i] = x; foo(i+1);})(iota(x.length));
>
> But I can't find a phobos primitive for each. Would have expected it in std.algorithm or std.functional?
>
> -Steve
Its been discussed a few times. There were some objections (IIRC Walter thought that there was no significant advantage over plain foreach).
| |||
June 03, 2014 Re: for, foreach identifier allowed in c throws error in d | ||||
|---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Mon, 02 Jun 2014 17:25:24 -0400, John Colvin <john.loughran.colvin@gmail.com> wrote: > On Monday, 2 June 2014 at 20:23:12 UTC, Steven Schveighoffer wrote: >> On Mon, 02 Jun 2014 15:58:01 -0400, Steven Schveighoffer <schveiguy@yahoo.com> wrote: >> >> >>> I'm trying to think of a way to do this without loops, but not sure. >> >> I'm surprised, I looked for some kind of "apply" function like map, but just calls some function with each element in the range. >> >> Something like this would make this a 1 (2?) liner: >> >> if(i == t.length) writeln(t) else each!((x) => {t[i] = x; foo(i+1);})(iota(x.length)); >> >> But I can't find a phobos primitive for each. Would have expected it in std.algorithm or std.functional? >> >> -Steve > > Its been discussed a few times. There were some objections (IIRC Walter thought that there was no significant advantage over plain foreach). Indeed, foreach is like such a construct: ... else each!((x) {t[i] = x; foo(i+1);})(iota(t.length)); ... else foreach(x; 0 .. t.length) {t[i] = x; foo(i+1);} It's even shorter and clearer. I agree with Walter. Since such a construct by definition wouldn't return anything, you can't chain it. There really is little reason to have it. -Steve | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply