Как правильно использовать функцию cl-position в clisp? - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь использовать cl-position в clisp, однако всякий раз, когда я пытаюсь запустить код, я получаю следующую ошибку:

    Prinayas-MacBook-Pro:~ pchoubey$ clisp project1.lisp
    *** - SYSTEM::%EXPAND-FORM:
          (PRINT (CL-POSITION "bar" '("foo" "bar" "baz") :TEST 'EQUAL)) should be
          a lambda expression

Почему это происходит и как я могу получить этот код правильно бегать? Для справки вот мой код:

(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)

1 Ответ

3 голосов
/ 20 марта 2020

сначала нам нужно сделать код лучше отформатированным и с отступом

(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.

...