Я не могу понять, что не так в этом простом фрагменте кода:
(deftemplate justanumber "a simple integer number, nothing more"
(slot val (type INTEGER))
)
(deffacts some_numbers
(justanumber (val 3) )
(justanumber (val 5) )
(justanumber (val 7) )
)
(deffunction prec "print the given number and all numbers down to zero included, recursively"
(?x)
(if (or (not (integerp ?x)) (< ?x 0)) then
(printout t "NaN or negative Error!" crlf)
else
(printout t "your number: " ?x crlf)
(if (> ?x 0) then
(prec(- ?x 1))
)
)
)
(defrule printtt-numbbb "simply prints an existing number"
(justanumber (val ?n))
=>
(printout t "printing " ?n crlf)
(prec(?n))
)
Когда я пытаюсь прочитать исходный файл, интерпретатор печатает это сообщение (в конце есть ошибка):
Defining deftemplate: justanumber
Defining deffacts: some_numbers
Defining deffunction: prec
Defining defrule: printtt-numbbb
[EXPRNPSR1] A function name must be a symbol
ERROR:
(defrule MAIN::printtt-numbbb "simply prints a number"
(justanumber (val ?n))
=>
(printout t "printing " ?n crlf)
(prec (?n
FALSE
Что вызывает эту ошибку?
РЕДАКТИРОВАНИЕ И РЕШЕНИЕ: Я выяснил ошибку (и решение): при написании prec(?n)
Clin go считает, что (?n)
- это вызов функции, но ?n
не имя функции (это переменная). Таким образом, решение состоит в том, чтобы просто удалить скобки до и после ?n
, поэтому правильный код:
(defrule printtt-numbbb "simply prints an existing number"
(justanumber (val ?n))
=>
(printout t "printing " ?n crlf)
(prec ?n )
)