Lisp, предупреждающий: xx ни не объявляется, ни связывается, его будут рассматривать, как будто он был объявлен ОСОБЕННЫЙ

Используйте интерфейсы, когда реализации той же функциональности будут отличаться.

Использование краткий обзор/базовые классы, когда необходимо совместно использовать общую конкретную реализацию.

7
задан Community 23 May 2017 в 12:30
поделиться

3 ответа

Вам необходимо привязать переменную 'result' - например, с помощью 'let' - перед тем, как начать ее использовать:

(defun it-fact(num)
  (let ((result 1))
    (dotimes (i num)
      (setf result (* result (+ i 1))))))

Для получения более подробной информации вы можете прочитать this ...

5
ответ дан 6 December 2019 в 10:52
поделиться

Есть несколько ошибок или не очень хорошего стиля Lisp:

(defun it-fact(num)                      ; style: use a space before (
  (setf result 1)                        ; bad: variable RESULT is not introduced
  (dotimes (i num)
    (setf result (* result (+ i 1)))     ; bad: extra addition in each iteration
  )                                      ; style: parentheses on a single line
)                                        ; bad: no useful return value

Возможная версия:

(defun it-fact (num)
  (let ((result 1))                      ; local variable introduced with LET
    (loop for i from 1 upto num          ; I starts with 1, no extra addition
      do (setf result (* result i)))
    result))                             ; result gets returned from the LET
7
ответ дан 6 December 2019 в 10:52
поделиться

В Лиспе локальные переменные должны быть явно объявлены с помощью LET или других форм, которые создают локальные переменные. Это отличается от, например, Python или JavaScript, где присвоение переменной создает переменную в текущей лексической области.

Ваш пример можно переписать следующим образом:

(defun it-fact(num)
  (let ((result 1))
    (dotimes (i num)
      (setf result (* result (+ i 1))))))

Комментарий не по теме: нет смысла помещать закрывающие круглые скобки в отдельные строки .

6
ответ дан 6 December 2019 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: