add_set_function
add_set_function — sets an expression to be evaluated when a given symbol changes
value.
add_set_function (symbol, s_exp)
symbolA symbol.
s_expAny Gamma or Lisp expression.
This function binds an expression to be evaluated whenever the value of
the symbol changes. This expression is available
globally, so if the value of the symbol changes
during a change in scope, the expression will be evaluated. All changes in
that sub-scope will trigger new evaluations of the expression. This can be
used to automatically maintain consistency between the program and a DataHub
instance, or to implement forward chaining in calculation rules. The
expression will not be evaluated if the new value is eq to the previous
value.
When a set expression (the s_exp) is being
evaluated the special variables this,
value and previous are all bound:
this The symbol whose value has changed.
value The current value of this as a result of the change.
previous The value of this immediately prior to the change.
Gamma>b = 5;5Gamma>add_set_function(#b,#princ("changed\n"));(princ "changed\n")Gamma>b = 4;changed 4Gamma>
The following code automatically sounds an alarm whenever a
computed_tank_level rises above 10000 and silences
the alarm whenever it drops below 10000. The DataHub instance is automatically
updated to maintain the same value as the Gamma task.
function send_to_datahub (point)
{
write_point(point, value);
}
function check_alarm (value)
{
if (value == 1)
sound_alarm();
else
silence_alarm();
send_to_datahub(this);
}
function check_tank_level (depth)
{
if (depth > 10000)
high_alarm = 1;
else
high_alarm = 0;
send_to_datahub(this);
}
add_set_function(#high_alarm, #check_alarm(high_alarm));
add_set_function(#computed_tank_level,#check_tank_level(computed_tank_level));