Как моя функция 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)