Как сравнить список с другим списком в LISP и избежать ошибки EVAL из-за неопределенной переменной? - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь сравнить два списка в общем списке, а затем вывести «ROBOT ROBB IE», если они совпадают. Один из входных данных - это список, данный пользователем (хранится в wff), а другой входной - это список из списка, называемого «nums». Однако, когда я запускаю свой код, я получаю следующую ошибку:

- EVAL: undefined function X

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

(defun same-elements (l1 l2)
  (and (subsetp l1 l2) (subsetp l2 l1)))


(defun answer-ynq()
;;;Defining the hash-table

  (setq nums '(13 15 19 33))
  (setq numsstuff '())

  (setq nums  (loop for i below 2
            collect (loop for e in '(Robot Robbie)
                  for j from 0
                  when (equal i j) collect '- else collect e)))
  (print nums)

  (print "Hello, please enter a command")
  (setq wff (read-delimited-list #\~))
  (terpri)
  (loop for x in nums
    do (if (same-elements (x wff))
                  (print "(ROBOT ROBBIE)")

                  ))

)


  (answer-ynq)

1 Ответ

0 голосов
/ 04 апреля 2020

Попробуйте это:

(defun same-elements (l1 l2)
  (and (subsetp l1 l2) (subsetp l2 l1)))


(defun answer-ynq()
;;;Defining the hash-table

  (setq nums '(13 15 19 33))
  (setq numsstuff '())

  (setq nums  (loop for i below 2
            collect (loop for e in '(Robot Robbie)
                  for j from 0
                  when (equal i j) collect '- else collect e)))
  (print nums)

  (print "Hello, please enter a command")
  (setq wff (read-delimited-list #\~))
  (terpri)
  (loop for x in nums
    do (if (same-elements x wff)
                  (print "(ROBOT ROBBIE)")

                  ))

)


(answer-ynq)

Единственное необходимое изменение: (same-elements x wff)

(same-elements (x wff)) означает вызов функции x, а затем передачу результата тем же элементам. Не то, что вы хотите.

Примечание: как уже отмечали другие, не стоит использовать setq таким образом.

...