Posted to tcl by aspect at Thu Sep 11 01:37:22 GMT 2014view pretty

# uses [info cmdexists]
proc newcmd {{prefix ::newcmd}} {
    if {![string match ::* $prefix]} {
        set prefix [uplevel 1 namespace current]::$prefix
        debug log {newcmd implicitly using caller's namespace: $prefix}
    }
    set i [llength [info commands ${prefix}*]]
    while {[info cmdexists ${prefix}${i}]} {incr i}
    return ${prefix}${i}
}

proc newvar {{prefix ::newvar}} {
    if {![string match ::* $prefix]} {
        set prefix [uplevel 1 namespace current]::$prefix
        debug log {newcmd implicitly using caller's namespace: $prefix}
    }
    set i [llength [info vars ${prefix}*]]
    while {[info exists ${prefix}${i}]} {incr i}
    return ${prefix}${i}
}

# gensym for namespaces. uses [namespace prefix]
proc newns {{prefix ::newns}} {
    if {![string match ::* $prefix]} {
        set prefix [uplevel 1 namespace current]::$prefix
        debug log {newcmd implicitly using caller's namespace: $prefix}
    }
    set pfx [namespace prefix $prefix]
    set name [namespace tail $prefix]
    set i [llength [namespace children $pfx ${name}*]]
    while {[namespace exists ${prefix}${i}]} {incr i}
    namespace eval ${prefix}${i} {namespace current}
}