Version 9 of tclsh as a powerful calculator

Updated 2004-07-14 09:17:31 by suchenwi

George Peter Staplin: July 10, 2004 - It sometimes amazes me how beautiful some aspects of Tcl are. I've been using proc unknown args {expr $args} for a while for doing calculations and tests when designing software. Today it occured to me that I could make life easier and avoid so many parentheses by extending that simple unknown procedure to this:

 proc unknown args {set ::that [expr $args]}

Now I can do:

 $ echo "proc unknown args {set ::that [expr \$args]}" > .tclshrc
 $ tclsh8.4 
 % 1000 * 256
 256000
 % $that / 8
 32000

Scott Nichols Really cool. Would there be any issues adding your calculator proc to existing Tcl applications? This would be helpful and save typing time for programmers.

George Peter Staplin: Error handling and auto-loading/lazy-loading might not work the same. You could do it this way:

 rename unknown _unknown
 proc unknown args {
  global that
  if {[catch {expr $args} that]} {
   uplevel 1 [concat _unknown $args]
  }
 }

MG That introduces some bugs for me on Win XP; when you enter a command that can't be parsed by expr, the $that variable is overwritten with an error message. Also, math commands handled by unknown no longer return the answer. Changing it like this works for me. . .

  rename unknown _unknown
  proc unknown {args} {
  global that
  if { [catch {expr $args} temp] } {
       uplevel 1 [concat _unknown $args]
     } else {
       set that $temp
     }
  }

George Peter Staplin: That is better! :)


Should the that variable move into a namespace to protect it from accidental overwrites?


RS Here's a simple one-liner for zsh (on bash it didn't work) to start a short-lived tclsh as calculator:

 $ tc () { echo puts '[expr' $@ ']' | tclsh }
 $ tc acos(-1)*2              
 6.28318530718

Category Mathematics