First class environments: Difference between revisions

Content added Content deleted
m (corrrected two misspellings, added a ;Task: section header, added whitespace before the TOC.)
Line 1,171: Line 1,171:
0 1 7 2 5 8 16 3 19 6 14 9
0 1 7 2 5 8 16 3 19 6 14 9
</pre>
</pre>

=={{header|Nim}}==
{{trans|C}}
<lang Nim>import strformat

const Jobs = 12

type Environment = object
sequence: int
count: int

var
env: array[Jobs, Environment]
sequence, count: ptr int

#---------------------------------------------------------------------------------------------------

proc hail() =
stdout.write fmt"{sequence[]: 4d}"
if sequence[] == 1: return
inc count[]
sequence[] = if (sequence[] and 1) != 0: 3 * sequence[] + 1
else: sequence[] div 2

#---------------------------------------------------------------------------------------------------

proc switchTo(id: int) =
sequence = addr(env[id].sequence)
count = addr(env[id].count)

#---------------------------------------------------------------------------------------------------

template forAllJobs(statements: untyped): untyped =
for i in 0..<Jobs:
switchTo(i)
statements

#———————————————————————————————————————————————————————————————————————————————————————————————————

for i in 0..<Jobs:
switchTo(i)
env[i].sequence = i + 1

var terminated = false
while not terminated:

forAllJobs:
hail()
echo ""

terminated = true
forAllJobs:
if sequence[] != 1:
terminated = false
break

echo ""
echo "Counts:"
forAllJobs:
stdout.write fmt"{count[]: 4d}"
echo ""</lang>

{{out}}
<pre> 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 5 1 8 10 11 2 14 16 17 3
1 1 16 1 4 5 34 1 7 8 52 10
1 1 8 1 2 16 17 1 22 4 26 5
1 1 4 1 1 8 52 1 11 2 13 16
1 1 2 1 1 4 26 1 34 1 40 8
1 1 1 1 1 2 13 1 17 1 20 4
1 1 1 1 1 1 40 1 52 1 10 2
1 1 1 1 1 1 20 1 26 1 5 1
1 1 1 1 1 1 10 1 13 1 16 1
1 1 1 1 1 1 5 1 40 1 8 1
1 1 1 1 1 1 16 1 20 1 4 1
1 1 1 1 1 1 8 1 10 1 2 1
1 1 1 1 1 1 4 1 5 1 1 1
1 1 1 1 1 1 2 1 16 1 1 1
1 1 1 1 1 1 1 1 8 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

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


=={{header|Order}}==
=={{header|Order}}==