それを完全に行うことはできませんが、ほとんどの目的に対して十分に類似したことを行うことができます。
通常、インタープリターでコマンド f1、f2、および f3 を作成してから、Tcl コマンドをまったく持たないサブインタープリターを作成し、そのサブインタープリターで公開したいコマンドをコマンドにエイリアスします。親で。
# First define f1-f3 in whatever way you want
# Now make the context; we'll use a safe interpreter for good measure...
set slave [interp create -safe]
# Scrub namespaces, then global vars, then commands
foreach ns [$slave eval namespace children ::] {
$slave eval namespace delete $ns
}
foreach v [$slave eval info vars] {
$slave eval unset $v
}
foreach cmd [$slave eval info commands] {
# Note: we're hiding, not completely removing
$slave hide $cmd
}
# Make the aliases for the things we want
foreach cmd {f1 f2 f3} {
$slave alias $cmd $cmd
}
# And evaluate the untrusted script in it
catch {$slave invokehidden source $theScript}
# Finally, kill the untrusted interpreter
interp delete $slave