Arjen Markus (24 october 2008) As follow-up to my experiments with Snit, here is one with XOTcl. See the comp.lang.tcl thread referred to in the code for some background information.
# wrap_integral.tcl --
# Small experiment with XOTcl: wrapping some of the
# numerical functions in Tcllib, to get a more object-oriented
# approach.
#
# See: http://groups.google.com/group/comp.lang.tcl/browse_frm/thread/8b42068973229a2e?hl=en#
#
package require XOTcl
package require math::calculus
# integrable --
# Define a simple class that allows you integrate a function (f)
# For individual objects, the function f must be defined separately
#
::xotcl::Class integrable
integrable method integral {a b} {
#
# Romberg returns the value and an error estimate. Just return the
# value of the integral.
#
lindex [::math::calculus::romberg [list [::xotcl::self] f] $a $b] 0
}
# main --
# Test this very basic type:
# - Create a few objects each with its own function f
#
integrable obj1
integrable obj2
integrable obj3 ;# No function f for this one!
obj1 proc f {x} {expr {$x}}
obj2 proc f {x} {expr {$x*exp(-$x)}}
foreach {a b} {1 2 3 4 5 6} {
puts "$a -- $b: [obj1 integral $a $b] [obj2 integral $a $b]"
}
#
# Override the existing function ...
#
puts "Defining a new function for the object:"
obj1 proc f {x} {expr {$x*cos($x)}}
puts "0 -- 2: [obj1 integral 0 2]"
#
# Express error
#
puts "This ought to cause a run-time error: \[obj3 integral 1 2\]:"
puts "1 -- 2 (obj3): [obj3 integral 1 2]"