сначала нам нужно сделать код лучше отформатированным и с отступом
(defun answer-ynq ()
(setq ROBOT '(IS_A_ROBOT ROBBIE))
(loop for x in ROBOT
do ((print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal))))
(setq KB (make-hash-table :test 'equal))
(setf (gethash '(IS_A_ROBOT ROBBIE) KB) T)
(setf (gethash '(IS_A_PERSON BOB) KB) T)
(setf (gethash '(IS_CLEVER ROBBIE) KB) T)
(setf (gethash '(OWNS ALICE ROBBIE) KB) T))
(answer-ynq)
Фактическая ошибка: неправильные скобки
((print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal)))
Нельзя ставить скобки вокруг такого вызова функции. Обычно круглые скобки не являются необязательными символами группировки, но они обеспечивают существенную структуру syntacti c.
Это должно быть:
(print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal))
Если в такой * 1016 требуется более одной формы * Выражение 1 имеет два базовых c варианта:
(loop ...
do (do-this foo bar)
(do-that foo baz))
или
(loop ...
do (progn
(do-this foo bar)
(do-that foo baz)))
progn
- это специальный оператор . Вложенные формы оцениваются один за другим, и возвращается последнее значение результата.
скрывается больше проблем
ROBOT
и KB
- неопределенные переменные. Если вы хотите ввести дополнительные локальные переменные, можно использовать let
и let*
.
cl-position
- неопределенная функция в Common Lisp. На самом деле это называется position
. В Common Lisp стандартная функция никогда не имеет префикса cl-
. У них есть этот префикс в Emacs Lisp, в котором отсутствуют пространства имен для имен функций и который используется в качестве уродливого хака. Common Lisp имеет пространства имен для имен функций (называемые packages ) и, таким образом, такие функции, как position
, не нуждаются в префиксе имени. С пространством имен имя в Common Lisp будет cl:position
или длиннее common-lisp:position
. Большую часть времени можно просто написать position
.