First class environments: Difference between revisions

Added EchoLisp
m (→‎{{header|Sidef}}: minor code simplification)
(Added EchoLisp)
Line 291:
Counts:
0 1 7 2 5 8 16 3 19 6 14 9</pre>
 
=={{header|EchoLisp}}==
'''(environment-new ((name value) ..) ''' is used to vreate a new envrionment. '''(eval form env)''' is used to evaluate a form in a specified environment.
<lang scheme>
(define (bump-value)
(when (> value 1)
(set! count (1+ count))
(set! value (if (even? value) (/ value 2) (1+ (* 3 value))))))
(define (env-show name envs )
(write name)
(for ((env envs)) (write (format "%4a" (eval name env))))
(writeln))
 
(define (task (envnum 12))
(define envs (for/list ((i envnum)) (environment-new `((value ,(1+ i)) (count 0)))))
(env-show 'value envs)
(while
(any (curry (lambda ( n env) (!= 1 (eval n env))) 'value) envs)
(for/list ((env envs)) (eval '(bump-value) env))
(env-show 'value envs))
(env-show 'count envs))
</lang>
{{out}}
<pre>
(task)
value 1 2 3 4 5 6 7 8 9 10 11 12
value 1 1 10 2 16 3 22 4 28 5 34 6
value 1 1 5 1 8 10 11 2 14 16 17 3
value 1 1 16 1 4 5 34 1 7 8 52 10
value 1 1 8 1 2 16 17 1 22 4 26 5
value 1 1 4 1 1 8 52 1 11 2 13 16
value 1 1 2 1 1 4 26 1 34 1 40 8
value 1 1 1 1 1 2 13 1 17 1 20 4
value 1 1 1 1 1 1 40 1 52 1 10 2
value 1 1 1 1 1 1 20 1 26 1 5 1
value 1 1 1 1 1 1 10 1 13 1 16 1
value 1 1 1 1 1 1 5 1 40 1 8 1
value 1 1 1 1 1 1 16 1 20 1 4 1
value 1 1 1 1 1 1 8 1 10 1 2 1
value 1 1 1 1 1 1 4 1 5 1 1 1
value 1 1 1 1 1 1 2 1 16 1 1 1
value 1 1 1 1 1 1 1 1 8 1 1 1
value 1 1 1 1 1 1 1 1 4 1 1 1
value 1 1 1 1 1 1 1 1 2 1 1 1
value 1 1 1 1 1 1 1 1 1 1 1 1
count 0 1 7 2 5 8 16 3 19 6 14 9
</pre>
 
=={{header|Erlang}}==