Algernon normally treats a value b in the slot p of a frame a as
an abbreviation for the logical predicate p(a,b). However, there
are times when it is useful to have the list of values (
...
) in a given Algernon slot.
In the following, we obtain the list of Adam's children in order to print it out.
(ask '((:bind ?kids (:values Adam child))
(:eval (format t "~%Adam's children are ~a." '?kids)))
:comment ":BIND the list of values in a slot.")
QUERYING: :BIND the list of values in a slot.
Adam's children are (ELLEN DONNA CHARLES).
Result:
Binding: ?kids --- (ellen "[ellen]" donna "[donna]" charles "[charles]")
=> T
We can also obtain the list of values in a slot to pass it to a Lisp function to compute some other value, in this case, the number of elements.
(ask '((:bind ?n (:funcall #'length (:values Adam child)))
(:eval (format t "~%Adam has ~a children." '?n)))
:collect '(Adam has ?n children)
:comment ":BIND and :FUNCALL evaluate a Lisp function")
QUERYING: :BIND and :FUNCALL evaluate a Lisp function
Adam has 3 children.
Result:
Binding: ?n --- 3
=> ((ADAM HAS 3 CHILDREN))