Posted to tcl by hypnotoad at Thu May 11 11:31:43 GMT 2017view raw
- proc foreach* {args} {
- set script [lindex $args end]
- set args [lrange $args 0 end-1]
- set dictval [concat {*}[lmap {k _} $args {string cat "[list $k] \[set [list $k]\]"}]]
- set script "set values \[dict create $dictval\]\n $script"
- foreach {b a} [lreverse $args] {
- set script [list foreach $a $b $script]
- }
- tailcall {*}$script
- }
- proc permutation {combinations body {valuevar values} {values {}} {level 0}} {
- incr level
- set final 1
- foreach {field valuelist} $combinations {
- if {[dict exists $values $field]} continue
- set final 0
- if {[llength $valuelist]==0} {
- dict set values $field {}
- permutation $combinations $body $valuevar $values $level
- } else {
- foreach value $valuelist {
- dict set values $field $value
- permutation $combinations $body $valuevar $values $level
- }
- }
- return
- }
- uplevel $level [list set $valuevar $values]
- uplevel $level [list dict with $valuevar {}]
- uplevel $level $body
- }
- set DATASET {
- compartment {5compt}
- generator {one two three}
- switchboard {one two three}
- }
- # Shimmer DATASET to be a list
- llength $DATASET
- set trial 0
- set start [clock clicks]
- permutation $DATASET {
- set permutation_clicks([incr trial]) [expr {[clock clicks]-$start}]
- }
- parray permutation_clicks
- set trial 0
- set start [clock clicks]
- foreach* {*}$DATASET {
- set foreach*_clicks([incr trial]) [expr {[clock clicks]-$start}]
- }
- parray foreach*_clicks
- set DATASET {
- compartment {5compt 8compt}
- generator {one two three}
- switchboard {one two three}
- cwplant {single double}
- cwloop {single portstarb foraft psfa}
- }
- # Shimmer DATASET to be a list
- llength $DATASET
- puts "BIGGER DATASET"
- set trial 0
- set start [clock clicks]
- permutation $DATASET {
- set permutation_clicks([incr trial]) [expr {[clock clicks]-$start}]
- }
- parray permutation_clicks
- set trial 0
- set start [clock clicks]
- foreach* {*}$DATASET {
- set foreach*_clicks([incr trial]) [expr {[clock clicks]-$start}]
- }
- parray foreach*_clicks