unknown

http://www.purl.org/tcl/home/man/tcl/TclCmd/unknown.htm

The unknown procedure is called if a command is not known to the interpreter. The default unknown handler tries to find a sourcable file to define the command in question, or, in interactive mode, tries to redirect the command to the operating system. For examples how to put unknown to other uses, see Radical language modification, or Let unknown know


As hinted above, manipulation of unknown can be a powerful metaprogramming technique, giving Tcl radically new behavior. unknown is implemented as a proc; among other reasons, it does elaborate string-handling that'd be tedious in C. One might imagine, though, in a "Small Tcl" context, construction of a minimal C-coded unknown implementation that both provides sufficient functionality for embedded situations (autoloading?) and occupies severely constrained memory.

GPS: A very useful unknown is:

 % proc unknown args {expr $args}
 % 1 + 2
 3
 % pow(2,20)
 1048576.0

AMG: Another way of writing that:

 % interp alias "" unknown "" expr
 unknown

This gives us a wonderfully useless way of doing stuff we could do all along:

 % puts moo
 moo
 % {[puts moo]}
 moo
 % {[{[puts moo]}]}
 moo

Good times, good times.


LES suggests this tiny improvement for anyone interested in starting to write a more sophisticated unknown procedure:

 set  unknown_original  [ info body  unknown ]

 proc  unknown  args  {

        if  [ regexp  {^[0-9]+\s*[/*+-]\s*[0-9]+}  $args ]  {
                return [ expr $args ]
         }

        if  [ regexp  {^pow\s*\([0-9]+,[0-9]+\)}  $args ]  {
                return [ expr $args ]
        }

        eval $::unknown_original
 }

AMG: It's not possible for a [regexp] to spot a valid [expr] expression. Maybe you can write one to detect candidate [expr]s, but things get really funny when the user creates his/her own math functions.


AMG: At the bottom of What kinds of variable names can be used in Tcl, RS writes about a neat idea begging to be implemented as an [unknown] proc. To motivate you to read further, I'll copy his example usage:

 foreach digit [0-9] {
    puts hello,$digit
 }