Posted to tcl by dbohdan at Sat Sep 05 12:40:57 GMT 2015view raw

  1. # http://wiki.tcl.tk/13840
  2.  
  3. # This works...
  4.  
  5. set countRef [ref 0 int]
  6.  
  7. proc make-counters n {
  8. global countRef
  9. set result {}
  10. for {set i 0} {$i < $n} {incr i} {
  11. lappend result [lambda {} countRef {
  12. setref $countRef [+ [getref $countRef] 1]
  13. }]
  14. }
  15. return $result
  16. }
  17.  
  18. lassign [make-counters 2] f g
  19. foreach p {f f f g g f} {
  20. puts "$p [[set $p]]"
  21. }
  22.  
  23. # ...but will continue to count from the same point since the counter is
  24. # global.
  25.  
  26. lassign [make-counters 2] f g
  27. foreach p {f f f g g f} {
  28. puts "$p [[set $p]]"
  29. }
  30.  
  31.  
  32. unset f
  33. unset g
  34. unset countRef
  35. puts ----------------
  36.  
  37. # This also does.
  38.  
  39. proc make-counters n [list [list countRef [ref 0 int]]] {
  40. set result {}
  41. for {set i 0} {$i < $n} {incr i} {
  42. lappend result [lambda {} countRef {
  43. setref $countRef [+ [getref $countRef] 1]
  44. }]
  45. }
  46. return $result
  47. }
  48.  
  49. lassign [make-counters 2] f g
  50. foreach p {f f f g g f} {
  51. puts "$p [[set $p]]"
  52. }
  53.  
  54. lassign [make-counters 2] f g
  55. foreach p {f f f g g f} {
  56. puts "$p [[set $p]]"
  57. }
  58.  
  59.  
  60. unset f
  61. unset g
  62. puts ----------------
  63.  
  64. # As does this.
  65.  
  66. proc make-counters n {
  67. set countRef [ref 0 int]
  68. set result {}
  69. for {set i 0} {$i < $n} {incr i} {
  70. lappend result [lambda {} countRef {
  71. setref $countRef [+ [getref $countRef] 1]
  72. }]
  73. }
  74. return $result
  75. }
  76.  
  77. lassign [make-counters 2] f g
  78. foreach p {f f f g g f} {
  79. puts "$p [[set $p]]"
  80. }
  81.  
  82. lassign [make-counters 2] f g
  83. foreach p {f f f g g f} {
  84. puts "$p [[set $p]]"
  85. }
  86.  
  87.  
  88. unset f
  89. unset g
  90.  
  91. # Output:
  92. # f 1
  93. # f 2
  94. # f 3
  95. # g 4
  96. # g 5
  97. # f 6
  98. # f 7
  99. # f 8
  100. # f 9
  101. # g 10
  102. # g 11
  103. # f 12
  104. # ----------------
  105. # f 1
  106. # f 2
  107. # f 3
  108. # g 4
  109. # g 5
  110. # f 6
  111. # f 7
  112. # f 8
  113. # f 9
  114. # g 10
  115. # g 11
  116. # f 12
  117. # ----------------
  118. # f 1
  119. # f 2
  120. # f 3
  121. # g 4
  122. # g 5
  123. # f 6
  124. # f 1
  125. # f 2
  126. # f 3
  127. # g 4
  128. # g 5
  129. # f 6
  130.