Maxima Function
define_variable (name, default_value, mode)
Introduces a global variable into the Maxima environment.
define_variable is useful in user-written packages, which are often translated or compiled.
define_variable carries out the following steps:
mode_declare (name, mode) declares the mode of name to the translator.
See for a list of the possible modes.
If the variable is unbound, default_value is assigned to name.
declare (name, special) declares it special.
Associates name with a test function to ensure that name is only assigned values of the declared mode.
The value_check property can be assigned to any variable which has been defined
via define_variable with a mode other than any.
The value_check property is a lambda expression or the name of a function of one variable,
which is called when an attempt is made to assign a value to the variable.
The argument of the value_check function is the would-be assigned value.
define_variable evaluates default_value, and quotes name and mode.
define_variable returns the current value of name,
which is default_value if name was unbound before,
and otherwise it is the previous value of name.
Examples:
foo is a Boolean variable, with the initial value true.
(%i1) define_variable (foo, true, boolean); (%o1) true (%i2) foo; (%o2) true (%i3) foo: false; (%o3) false (%i4) foo: %pi; Error: foo was declared mode boolean, has value: %pi -- an error. Quitting. To debug this try debugmode(true); (%i5) foo; (%o5) false
bar is an integer variable, which must be prime.
(%i1) define_variable (bar, 2, integer); (%o1) 2 (%i2) qput (bar, prime_test, value_check); (%o2) prime_test (%i3) prime_test (y) := if not primep(y) then error (y, "is not prime."); (%o3) prime_test(y) := if not primep(y) then error(y, "is not prime.") (%i4) bar: 1439; (%o4) 1439 (%i5) bar: 1440; 1440 is not prime. #0: prime_test(y=1440) -- an error. Quitting. To debug this try debugmode(true); (%i6) bar; (%o6) 1439
baz_quux is a variable which cannot be assigned a value.
The mode any_check is like any,
but any_check enables the value_check mechanism, and any does not.
(%i1) define_variable (baz_quux, 'baz_quux, any_check); (%o1) baz_quux (%i2) F: lambda ([y], if y # 'baz_quux then error ("Cannot assign to `baz_quux'.")); (%o2) lambda([y], if y # 'baz_quux then error(Cannot assign to `baz_quux'.)) (%i3) qput (baz_quux, ''F, value_check); (%o3) lambda([y], if y # 'baz_quux then error(Cannot assign to `baz_quux'.)) (%i4) baz_quux: 'baz_quux; (%o4) baz_quux (%i5) baz_quux: sqrt(2); Cannot assign to `baz_quux'. #0: lambda([y],if y # 'baz_quux then error("Cannot assign to `baz_quux'."))(y=sqrt(2)) -- an error. Quitting. To debug this try debugmode(true); (%i6) baz_quux; (%o6) baz_quux