Как моя функция LISP является несвязанной переменной?

Я определяю функцию в LISP, и она определяет правильно. Но всякий раз, когда я пытаюсь вызвать его, я получаю сообщение об ошибке "Переменная FACTORIAL не связана".

Я пробовал это на OS X и Windows 7, на LispWorks и Allegro. Функция -

(defun factorial (x)
   (if (= 1 x) 1
       (* x factorial (- 1 x))))

Любая помощь приветствуется.

4 ответа

В третьей строке вашего кода вы умножаете x раз factorial раз 1-x,

Первое, что нужно отметить, это factorial не переменная: это функция. Поскольку Common-Lisp - это Lisp-2, факториал вообще не связан как переменная - он связан как функция.

Вы должны звонить factorial функция на один меньше чем xне x меньше одного

Так:

(defun factorial (x)
   (if (= 1 x) 1
       (* x (factorial (- x 1)))))

... должен сделать это.

Похоже, вам не хватает скобок:

(defun factorial (x) 
   (if (= 1 x) 1 
       (* x (factorial (- 1 x))))) 

Без () вокруг factorialЛисп думает, что вы ссылаетесь на переменную вместо функции.

Чтобы завершить ответ @Isaac Hodes, мы покажем, что в CL есть два пространства имен для функции и переменной. У вас не было бы той же ошибки, если бы вы были в схеме. Вы можете прочитать больше здесь.

Вам необходимо связать все переменные и вызовы функций, которые вы собираетесь использовать, в скобках, если только вы не хотите, чтобы они были символами. О несвязанных ошибках у Пола Грэма есть хороший пример в своей книге: Ansi Common Lisp

Одна из самых распространенных жалоб, которые вы услышите от Lisp, заключается в том, что символ не имеет значения или не связан. Несколько отдельных проблем проявляются таким образом. Локальные переменные, подобные тем, которые установлены let и defun, действительны только в теле выражения, в котором они созданы. Поэтому, если мы попытаемся сослаться на такую ​​переменную вне let, которая ее создаст:

> (progn (let ((x 10))
                    (format t "Here x = ~A.~%" x))
                  (format t "But now it's gone...~%") x)
Другие вопросы по тегам