Неопределенная переменная в sbcl, а не в clisp - PullRequest
1 голос
/ 17 марта 2012

Загрузка следующих 2 функций на clisp проходит успешно.

(defun func1 (l)
  (defvar *count* nil)
  (setq count 1)
  (cond ((null l) 0)
        ((atom l) (+ count 1))
        ((atom (car l)) (+ count (func1 (cdr l))))
        ((listp (car l)) (+ (func1 (car l)) (func1 (cdr l))))
        (t nil))    )
(defun func2 (l)
  (defvar *resLis* nil)
  (setq resLis '((0 0)))
  (anotherFunc l resLis)  
)

Однако sbcl вызывает ошибку:

warning: undefined variable: COUNT
warning: undefined variable: RESLIS
Compilation failed.

Я предпочитаю использовать sbcl (поскольку мой slime подходит только для него), но что не так с кодами выше?

Среда: Ubuntu 11.10, GNU CLISP 2.49, SBCL 1.0.50.0.debian

Ответы [ 2 ]

9 голосов
/ 17 марта 2012

SBCL не «вызывает ошибку».Компилятор печатает предупреждение .CLISP может не предупреждать, если вы используете его интерпретатор, а не его компилятор.SBCL использует компилятор по умолчанию.

Что не так?

  • DEFVAR - форма верхнего уровня, определяющая глобальную переменную.Использование его в функции возможно, но не рекомендуется.

  • count просто не определено.Как говорит SBCL.Вы нигде не определили переменную count.

4 голосов
/ 17 марта 2012

Во-первых, обратите внимание, что *count* и count - это две разные вещи.То же самое касается *resLis* и resLis.

Во-вторых, что это : делает в середине func1?

В-третьих, где anotherFunc?

В-четвертых, не используйте defvar в функции;это для глобалов!

Как только вы решите это, вам будет легче начать работу.

...