Posted to tcl by stu at Mon Jan 10 13:45:42 GMT 2022view pretty

$ cat nsy.tcl

namespace eval main {
    namespace eval module_a {
        proc  openModule {args} { return  open:$args }
        proc closeModule {args} { return close:$args }

        proc module_a {args} {
            namespace path [namespace parent]
            set me [namespace tail [lindex [info level 0] 0]]
            namespace ensemble create -prefixes no -command $me \
                -map [dict create open openModule close closeModule]
            rename $me _$me
            # Module-specific initialization begin
            # put code here
            # Module-specific initialization end
            tailcall $me {*}$args
        }
        namespace export module_a
    }
    namespace import module_a::*
}

$ tclsh
% source nsy.tcl
% namespace eval main { list [module_a open a b c] [module_a close 1 2 3] [module_a open x y z] }
{open:a b c} {close:1 2 3} {open:x y z}


$ tclsh
% source nsy.tcl
% list [main::module_a open a b c] [main::module_a close 1 2 3] [main::module_a open x y z]
{open:a b c} {close:1 2 3} {open:x y z}

$ tclsh
% source nsy.tcl
% main::module_a z
unknown subcommand "z": must be close, or open