Неопределенная переменная в sbcl, а не в clisp

Загрузка следующих двух функций на 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


person IsaacS    schedule 17.03.2012    source источник
comment
что там делает двоеточие?   -  person Rainer Joswig    schedule 17.03.2012
comment
Как я уже упоминал в комментарии к ответу @Arlen Cuss, я просто попытался упростить, думая, что эта часть не имеет решающего значения для вопроса. Поскольку 2 человека задались вопросом, я изменил свой вопрос, добавив скрытую часть.   -  person IsaacS    schedule 17.03.2012


Ответы (2)


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

Что случилось?

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

  • count просто не определено. Как говорит SBCL. У вас нигде не определена переменная count.

person Rainer Joswig    schedule 17.03.2012
comment
Я забыл упомянуть / процитировать, что на SBCL компиляция завершается сбоем в дополнение к предупреждению о печати (я обновил описание вопроса), что препятствует выполнению. И даже если я объявлю строку DEFVAR вне определения функции, результат будет тот же. - person IsaacS; 17.03.2012
comment
Итак, ваша вторая пуля (count не определена) является причиной, по которой SBCL возвращает ошибки, я думаю. Я все еще пытаюсь понять, почему count не определено. Кстати, теперь я проверил, что CLISP также предупреждает, когда я использую compile-file, но без ошибок. - person IsaacS; 17.03.2012

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

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

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

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

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

person Asherah    schedule 17.03.2012
comment
Спасибо. Поскольку я пытался упростить вопрос, я опустил то, что считал ненужным (например, : и anotherFunc). А под 4th вы могли иметь в виду defvar. - person IsaacS; 17.03.2012
comment
@IsaacS упс, ты прав! Не могли бы вы пояснить цель кода? Возможно, нам будет полезно помочь вам. Пытается ли он подсчитать максимальную глубину некоторых вложенных списков? - person Asherah; 18.03.2012