Как моя функция LISP является несвязанной переменной? - PullRequest
10 голосов
/ 31 августа 2010

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

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

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

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

Ответы [ 4 ]

16 голосов
/ 31 августа 2010

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

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

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

Итак:

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

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

5 голосов
/ 31 августа 2010

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

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

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

1 голос
/ 31 августа 2010

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

0 голосов
/ 07 апреля 2011

Вам необходимо связать все переменные и вызовы функций, которые вы собираетесь использовать, в скобках, если только вы не хотите, чтобы они были символами.Что касается несвязанных ошибок, Пол Грэм имеет хороший пример в своей книге: 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)
...