Функцией в CLIPS называется часть кода, имеющая имя и возвращающая полезный результат или выполняющая полезные действия (например, отображение информации на экране). В дальнейшем в книге функциями будут называться, как правило, только функции, возвращающие результат. Функции, не возвращающие результат и выполняющие некоторую полезную работу, как правило, называются командами.
CLIPS оперирует с несколькими типами функций — определенные пользователем внешние функции, системные (внутренние) функции, функции, определенные в среде CLIPS с помощью конструктора deffunction, родовые функции. Определенные пользователем внешние функции и системные функции создаются на внешних языках программирования (например, С), и затем подключаются к CLIPS на этапе компилирования или функционирования среды. Системные функции созданы разработчиками среды CLIPS и описаны в руководстве. Описания наиболее важных системных функций приведены в гл. 15 и 16.
Конструктор deffunction позволяет пользователям определять новые функции непосредственно в CLIPS. Функции, созданные таким образом, действуют так же, как внешние или системные функции CLIPS, за исключением того, что вместо непосредственного выполнения (как, например, в случае вызова определенной пользователем внешней функции) вызов такой функции обрабатывается встроенным интерпретатором языка CLIPS. Подробней о функциях, созданных с помощью конструктора deffunction, будет рассказано в гл. 8.
Родовые функции определяются с помощью конструкторов defgeneric и defmethod. Родовые функции позволяют выполнять различные действия, в зависимости от набора аргументов, заданных при вызове функции. Таким образом функция перегружается различными реализациями (подобный механизм перегрузки функций можно встретить, например, в языке C++). Более подробно родовые функции описаны в гл. 10.
Вызов функций в CLIPS имеет префиксную нотацию — аргументы функции всегда следуют после имени функции. При вызове имя функции вместе со всеми аргументами заключается в круглые скобки. Аргументы отделяются друг от друга по крайней мере одним пробелом. Аргументами функций могут быть переменные примитивных типов, константы или вызовы других функций. Ниже приведены примеры использования функций + (арифметическое сложение) и * (арифметическое умножение):
Пример 4.9. Использование функций + и *
(+345)
(* 5 6.0 2)
(+ 3 (* 8 9) 4)
(* 8 (+3 (* 2 3 4) 9) (* 3 4))
Выражением в CLIPS называется неименованный отрезок кода, вызывающий функции с некоторым набором аргументов. Фактически предыдущий пример состоит из четырех выражений.