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

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

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

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

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

10
задан Isaac 31 August 2010 в 01:30
поделиться

3 ответа

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

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

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

Итак:

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

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

16
ответ дан 3 December 2019 в 17:56
поделиться

Похоже, ты пропал набор скобок:

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

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

5
ответ дан 3 December 2019 в 17:56
поделиться

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

1
ответ дан 3 December 2019 в 17:56
поделиться