Updated 2016-03-03 06:21:14 by pooryorick

namespace eval, evaluates a script in a given namespace.

See Also  edit


Synopsis  edit

namespace eval namespace arg ?arg ...?

Description  edit

args are concatenated together in the same fashion as eval, with with a space between each one, and the result is evaluated in the namespace called namespace. namespace and any namespaces that qualify it are automatically created as necessary.

Unlike eval, namespace eval operates at new level, such that uplevel 1 accesses the level from which namespace eval was called. In spite of this, return within namespace eval script operates as if it were uplevel return, i.e., it causes the caller of namespace eval to return. It would probably be more useful if return within a namespace eval script behaved the way it does within source ... script, causing only namespace eval itself to return.

For better performance, namespace eval ... is usually byte-compiled when it is given one argument which is a literal string:
proc main {
    namespace eval [info cmdcount] {
        set msg {this script is eligible to be byte-compiled}
        return $msg

PYK 2016-03-12: namespace eval adds an evaluation level, but doesn't allow a tailcall to replace that level. To create a command prefix that changes to some namespace to call the command, while arranging for the caller of the command to be one level up:
list apply [list args {::tailcall somecommand {*}$args} some_namespace]

The resulting command prefix is useful, for example, as the value of the -unknown option for a namespace ensemble.