Использование interp alias
позволяет использовать содержимое a
и b
во время создания псевдонима:
interp alias {} foo_ab {} foo $a $b
Если вам нужно использовать значения во времяэто называется, вам нужна вспомогательная процедура вместо:
proc foo_ab args {
global a b
uplevel 1 [list foo $a $b {*}$args]
# Or this in older Tcl: uplevel 1 [list foo $a $b] $args
}
В 8.5 это также может быть записано с псевдонимами и apply
:
interp alias {} foo_ab {} apply {args {
global a b
uplevel 1 [list foo $a $b {*}$args]
}}
В 8.6 вы можете оптимизироватьдалее, используя tailcall
:
interp alias {} foo_ab {} apply {args {
global a b
tailcall foo $a $b {*}$args
}}
Вы также можете использовать другие, более грязные трюки, такие как:
interp alias {} foo_ab {} namespace inscope :: {foo $a $b}
Это не особенно быстро, но работает во всех Tcl8. * версии.