**Generic Calculator Namespace Package Example** This page is under development. Comments are welcome, but please load any comments in the comments section at the bottom of the page. Please include your wiki MONIKER and date in your comment with the same courtesy that I will give you. Aside from your courtesy, your wiki MONIKER and date as a signature and minimal good faith of any internet post are the rules of this TCL-WIKI. Its very hard to reply reasonably without some background of the correspondent on his WIKI bio page. Thanks, [gold] 12Dec2018 ---- <> **Introduction** ---- [gold] Here is an eTCL script for generic calculator in a namespace. The original program used global statements to pass data among subroutines. Some routines are working in canvas, clear,fillup,exit,load new testcase and solve with button. With number and all of variables so specified upfront, not sure how to float the calculations into the shell. Other than to put an statement answer is [ expr{ side1*side2...}] ---- *** Context and starter code for namespace version*** [aspect] /excerpted/ many of your examples seem to have a common presentation, with a similar GUI consisting of: a set of labelled boxes for user input a "Solve" button which calls your main logic with the inputs as arguments a few "Testcase" buttons to illustrate examples and test the code "About", "Clear" and "Exit" buttons I for one would love to see the GUI side of the code factored out into a common framework which each example could share. That way the wiki page for each calculator example could be focussed on the logic, looking something more like this: ====== namespace eval linear_interp { set name "Linear Interpolation Calculator" set inputs {"First X value" x1 "First Y value" y1 "Second X value" x2 "Second y value" y2 "Solve for x" xx} set about "This is Gold's linear interpolation calculator, © 2011 .. with some more information on how it works and is used, etc" set testcases { {10. 10. 200. 50. 123.} # etc } proc calculate {x1 x2 y1 y2 xx} { return [expr {some magic here to calculate the result}] } } load generic_calculator_gui.tcl generic_calculator_gui linear_interp ====== As a secondary advantage, your calculator could then without modification be used in other contexts, such as a command line or web tool or automatically invoking all the test cases. Of course, the GUI can also be easily re-skinned to the user's preferences without impacting the main code. I hope you don't find the above overly critical or discouraging, that's certainly not my intention -- but I do think keeping the above points in mind will make your pages more appealing to other wiki'ers and encourage collaboration .. which is what we're all here for, after all! ---- [gold] 12Dec2018.Reply to [aspect]. I am still learning TCL. The namespace command is considered an advanced feature of TCL, according to Brent Welch & other textbooks. I am running into lock up on versions past the existing namespace program (published code), possibly due to the globals. I cannot seem to get more variables under the "quilt" of the namespace. I am posting the working TCL code available, short of the catastrophic coding failures. I much appreciate your advanced comments and offer of collaboration from the TCL-wiki. But the "collective you" should be aware that the TCL code published here has reached the level of my (Fortran77) skill set, without substantial input from the "TCL pros". From the referenced code on your bio page, its obvious to me that your skill set is much greater than mine. Thanks,[gold] ---- [gold] changes: pulled procs pi,interlinear,pol,errorx,height5. and changed to wm . "title". Former idea was that user could use interpolate routine in the punched console. Conjecture below was that in a namespace version, subroutines would be available, but not all called from the namespace. ---- In that case, you might consider placing them into a namespace (i.e. ::gold::) and placing that common code on your main "gold" page. Then each other example page can refer to that one common location for the common items. Of course you would want to modify the examples to both load the ::gold definitions file from the [gold] page, and to make use of the procs therein instead of defining each individually. ---- **Testcase 1.** %|quantity|number|units|% &| star formation | 10.|rate per year |& &|stars with planets | .5|stars|& &| potential life | 2. ||& &| actual life | 1. ||& &| fraction develop civilization |.01 |none|& &| fraction technology |.01|none|& &| years available |10000.|years|& &|number of civilizations equal 10.* .5 * 2. * 1. * .01 * .01 * 10000.||& &|answer: 10. ||civilizations|& ---- ***ScreenShots Section:*** [Generic Calculator Namespace Package Example screen.png] ---- ***References:*** * http://en.wikipedia.org/wiki/Drake_equation * http://www.astrodigital.org/astronomy/drake_equation.html * [expr] * [Importing expr functions] * [Category Package] * [Importing expr functions, part 2] * [namespace] * [package] * [Namespace resolution of Variables & Procedures] * [http://en.wikibooks.org/wiki/Tcl_Programming/expr] * [A little calculator] * [A minimal console] ---- ****Appendix Code**** ****appendix TCL programs and scripts **** ---- ****Pretty Print Version *** ***Trial Version under test*** ====== package provide calculatorslot 1.0 namespace eval slot { # program: "generic calculator in namespace" # drake equation usded in calculations # written on Windows XP on eTCL # working under TCL version 8.5.6 and eTCL 1.0.1 # gold on TCL WIKI , 24may2011 variable colorhigh variable colorback variable answer2 variable answer3 variable side1 variable side2 variable side3 variable side4 variable side5 variable side6 variable side7 variable side8 variable maxlist namespace export clearx namespace export fillup array set params \ { title {calculator} width 400 height 240 ratio 1.6888 colorback {aquamarine4} colorhigh {brown} maxlistx 5 side1 .1 side2 .1 side3 .1 side4 .1 side5 .1 side6 .1 side7 .1 side8 .1 } set maxlist $params(maxlistx) proc initdisplay {} { variable titlex variable colorhigh variable colorback variable quantitylist variable maxlist variable side1 variable side2 variable side3 variable side4 variable side5 variable side6 variable side7 variable side8 frame .frame -relief flat -bg $slot::colorback pack .frame -side top -fill y -anchor center set names $slot::quantitylist foreach i {1 2 3 4 5 6 7 8 9 10} { if {$i >= $maxlist} {break} label .frame.label$i -text [lindex $names $i] -anchor e entry .frame.entry$i -width 35 -textvariable side$i grid .frame.label$i .frame.entry$i -sticky ew -pady 2 -padx 1 } frame .buttons -bg $slot::colorback ::ttk::button .calculator -text "Solve" -command { slot::calculate } ::ttk::button .test2 -text "Testcase1" -command {slot::clearx;slot::fillup 10. .5 2. 1. .01 .01 10000. 10.} ::ttk::button .test3 -text "Testcase2" -command {slot::clearx;slot::fillup 11. .5 2. 1. .01 .01 10001. 10. } ::ttk::button .test4 -text "Testcase3" -command {slot::clearx;slot::fillup 12. .5 2. 1. .01 .01 10002. 10. } ::ttk::button .clearallx -text clear -command {slot::clearx } ::ttk::button .about -text about -command {slot::about} ::ttk::button .cons -text report -command { slot::reportx } ::ttk::button .exit -text exit -command {exit} pack .calculator -in .buttons -side top -padx 10 -pady 5 pack .clearallx .cons .about .exit .test4 .test3 .test2 -side bottom -in .buttons grid .frame .buttons -sticky ns -pady {0 10} . configure -background $slot::colorback -highlightcolor $slot::colorhigh -relief raised -border 30 wm title . $slot::titlex } proc about {} { variable msgx set msg $slot::msgx tk_messageBox -title "About" -message $msg } proc calculate { } { variable maxlist variable answer2 variable answer3 variable side1 variable side2 variable side3 variable side4 variable side5 variable side6 variable side7 variable side8 set answer2 1. set answer2 [ expr {$answer2 * $::side1 }] set answer2 [ expr {$answer2 * $::side2 }] set answer2 [ expr {$answer2 * $::side3 }] set answer2 [ expr {$answer2 * $::side4 }] set answer2 [ expr {$answer2 * $::side5 }] set answer2 [ expr {$answer2 * $::side6 }] set answer2 [ expr {$answer2 * $::side7 *1. }] set ::side8 $answer2 } proc fillup {aa bb cc dd ee ff gg hh} { variable maxlist foreach i {1 2 3 4 5 6 7 8 9 10} { if {$i >= $maxlist} {break} .frame.entry$i insert 0 "1.0" } variable side1 variable side2 variable side3 variable side4 variable side5 variable side6 variable side7 variable side8 set ::side1 $slot::params(side1) set ::side2 $slot::params(side2) set ::side3 $slot::params(side3) set ::side4 $slot::params(side4) set ::side5 $slot::params(side5) set ::side6 $slot::params(side6) set ::side7 $slot::params(side7) set ::side8 $slot::params(side8) set ::side1 $aa set ::side2 $bb set ::side3 $cc set ::side4 $dd set ::side5 $ee set ::side6 $ff set ::side7 $gg set ::side8 $hh } proc clearx {} { variable maxlist foreach i {1 2 3 4 5 6 7 8 9 10} { if {$i >= $maxlist} {break} .frame.entry$i delete 0 end } } proc reportx {} { variable colorwarning variable colorback variable answer2 variable answer3 variable side1 variable side2 variable side3 variable side4 variable side5 variable side6 variable side7 variable side8 console show; puts " " puts " star formation /yr: " puts " fraction w/ planets: " puts " poss life : " puts " actual life: " puts " civiliation develop: " puts " detectable signs: " puts " length years: " puts " civilizations: " puts "answer is " } } #-------------------------- end namespace proc slotshell {} { set slot::titlex "Drake Equation Calculator in Namespace" set slot::colorback aquamarine4 set slot::colorhigh brown set slot::msgx "Drake Calculator in Namespace. from TCL WIKI, written on eTCL " set slot::quantitylist {{} {star formation /yr:} {fraction w/ planets:} {poss life :} {actual life:} {civiliation develop:} {detectable signs:} {length years:} { civilizations:} } namespace import slot::* array set slot::params \ { title {calculatorx} width 999 height 999 ratio 1.6888 colorback {aquamarine4} colorhigh {brown} maxlist 9 side1 10. side2 .5 side3 2. side4 1. side5 .01 side6 .01 side7 10000. side8 10. } set slot::maxlist $slot::params(maxlist) slot::initdisplay # button configure statement does not work before or # if initdisplay is not initialized!!! .test3 configure -text "Testcase5" .test3 configure -command {slot::clearx;slot::fillup 11. .5 2. 1. .01 .01 10009. 10. } } slotshell ====== ---- For the push buttons, the recommended procedure is push testcase and fill frame, change first three entries etc, push solve, and then push report. Report allows copy and paste from console. ---- *** tcl8.5 code scraps *** ====== push report button and etcl console comes up 1% namespace import ::tcl::mathop::* 2% * 5 6 7 8 8 13440 3% * 2 2 2 2 2 2 2 2 2 2 1024 * $slot::params(side1) $slot::params(side1) $slot::params(side2) $slot::params(side3) 2% * $slot::params(side1) $slot::params(side2) $slot::params(side3) $slot::params(side4) 10.01 4% winfo children . .frame .buttons .calculator .test2 .test3 .test4 .clearallx .about .cons .exit . configure -background $slot::colorback -highlightcolor $slot::colorhigh -relief raised -border 30 # configure test buttons in the shell # statements working in the console started by push report. #? .test3 reported as unknown when loaded in the shell? # configure statement does not work if initdisplay is not initialized!!! .test3 configure -command {slot::clearx;slot::fillup 19. .5 2. 1. .02 .02 10009. 10. } .test3 configure -text "chg_Testcase5" #??? console eval {.test3 configure -text "Testcase 5"} ====== ---- ---- **Hidden Comments Section** ---- Please place any comments here, Thanks. <> ---- Please place any comments here with your wiki MONIKER and date, Thanks.[gold]12Dec2018 ---- <> Numerical Analysis | Toys | Calculator | Mathematics| Example| Toys and Games | Games | Application | GUI ---- <> Development | Concept| Algorithm | Statistics