An instance-set query function can be called from anywhere that a regular function can be called. If a variable from an outer scope is not masked by an instance-set member variable, then that variable may be referenced within the query and action. In addition, rebinding variables within an instance-set function action is allowed. However, attempts to rebind instance-set member variables will generate errors. Binding variables is not allowed within a query. Instance-set query functions can be nested.
Example
CLIPS>
(deffunction count-instances (?class)
(bind ?count 0)
(do-for-all-instances ((?ins ?class)) TRUE
(bind ?count (+ ?count 1)))
?count)
CLIPS>
(deffunction count-instances-2 (?class)
(length (find-all-instances ((?ins ?class)) TRUE)))
CLIPS> (count-instances WOMAN)
3
CLIPS> (count-instances-2 BOY)
4
CLIPS>
Instance-set member variables are only in scope within the instance-set query function. Attempting to use instance-set member variables in an outer scope will generate an error.
Example
CLIPS>
(deffunction last-instance (?class)
(any-instancep ((?ins ?class)) TRUE)
?ins)
[PRCCODE3] Undefined variable ins referenced in deffunction.
ERROR:
(deffunction last-instance
(?class)
(any-instancep ((?ins ?class))
TRUE)
?ins
)
CLIPS>