Artifact
92b38153db7fc388264995c275d974b145f97be3:
Attachment "tmp1" to
ticket [3588176fff]
added by
pooryorick
2012-11-17 23:01:37.
#! /bin/env tclsh
if {[namespace which [namespace current]::for_global] eq {}} {
rename ::for for_global
if {[namespace current] ne "::"} {
interp alias {} ::for {} [namespace current]::for
}
}
proc for args {
if {[lindex $args 1] eq "in"} {
if {[llength $args] % 3 != 1} {
return -code error "wrong # of arguments"
}
set iters [dict create]
set vars [dict create]
while {[llength $args] > 1} {
set args [lassign $args[unset args] varnames /dev/null iter]
if {$iter ne {} && [uplevel [::list namespace which $iter]] eq {}} {
return -code error "no such iterator: $iter. Maybe \[foreach] was intended?"
}
dict set iters $iter 1
dict set vars $varnames $iter
}
set body [lindex $args[set args {}] 0]
while {[dict size $iters]} {
set newvals[set newvals {}] [dict create]
dict for {varnames iter} $vars {
foreach varname $varnames {
if {[namespace which $iter] eq {}} {
dict set newvals $varname {}
} else {
dict set newvals $varname [uplevel [list $iter]]
if {[namespace which $iter] eq {}} {
dict unset iters $iter
dict set newvals $varname {}
}
}
}
}
if {[dict size $iters]} {
dict for {varname val} $newvals {
uplevel [list variable $varname $val]
}
set code [catch {uplevel $body} result]
switch -exact -- $code {
0 {}
1 {
return -errorcode $::errorCode -code error $result
}
3 {
# FRINK: nocheck
return
}
4 {}
default {
return -code $code $result
}
}
} else {
break
}
}
} else {
uplevel [list [namespace current]::for_global {*}$args]
}
}
proc iterdir {path} {
variable uniqueid
set subdirs [list $path]
coroutine [incr uniqueid] apply { path {
set yield [yield [info coroutine]]
foreach item [glob -nocomplain -directory $path *] {
if {[file isdirectory $item]} {
for item in [iterdir $item] {
yield $item
}
} else {
yield $item
}
}
}} $path
}
variable uniqueid 0
set tempdir [file mkdir zook1]
file mkdir [set tmpa [file join $tempdir tmpa]]
set res [list]
for item in [iterdir $tempdir] {
lappend res [string range $item [string length $tempdir] end]
}
puts $res