First class environments: Difference between revisions

Content added Content deleted
(→‎{{header|C}}: using goto (yes!))
Line 14: Line 14:


#define JOBS 12
#define JOBS 12
#define jobs(a) switch_to(0); for (a = 0; a < JOBS; switch_to(++a))
#define jobs(a) for (switch_to(a = 0); a < JOBS || !printf("\n"); switch_to(++a))
typedef struct { int seq, cnt; } env_t;
typedef struct { int seq, cnt; } env_t;


Line 23: Line 23:
{
{
printf("% 4d", *seq);
printf("% 4d", *seq);
if (*seq != 1) (*cnt)++;
if (*seq == 1) return;
++*cnt;
else return;
*seq = (*seq & 1) ? 3 * *seq + 1 : *seq / 2;

if ((*seq & 1)) *seq = 3 * *seq + 1;
else *seq /= 2;
}
}


Line 38: Line 36:
int main()
int main()
{
{
int i, done = 0;
int i;
jobs(i) { env[i].seq = i + 1; }
jobs(i) { env[i].seq = i + 1; }


again: jobs(i) { hail(); }
while (!done) {
jobs(i) hail();
jobs(i) { if (1 != *seq) goto again; }
printf("\n");

done = 1;
jobs(i) if (*seq != 1) done = 0;
}


printf("COUNTS:\n");
printf("COUNTS:\n");
jobs(i) printf("% 4d", *cnt);
jobs(i) { printf("% 4d", *cnt); }
printf("\n");


return 0;
return 0;
}</lang>output<lang> 1 2 3 4 5 6 7 8 9 10 11 12
}</lang>output<lang>
1 2 3 4 5 6 7 8 9 10 11 12
1 1 10 2 16 3 22 4 28 5 34 6
1 1 10 2 16 3 22 4 28 5 34 6
1 1 5 1 8 10 11 2 14 16 17 3
1 1 5 1 8 10 11 2 14 16 17 3
Line 73: Line 66:
1 1 1 1 1 1 1 1 4 1 1 1
1 1 1 1 1 1 1 1 4 1 1 1
1 1 1 1 1 1 1 1 2 1 1 1
1 1 1 1 1 1 1 1 2 1 1 1

COUNTS:
COUNTS:
0 1 7 2 5 8 16 3 19 6 14 9</lang>
0 1 7 2 5 8 16 3 19 6 14 9</lang>