Несвязанная переменная в имени функции - PullRequest
2 голосов
/ 06 декабря 2010

Я пишу программу на Лиспе (общий диалект lisp) .. Я хочу, чтобы программа посчитала количество подсписков в списке. Вот что я написал до сих пор:

(defun llength (L)
      (cond 
          ((null L)   0)    
          ((list (first L)) (progn (+ (llength (first L)) 1) (llength (rest L))))    
          ((atom (first L)) (llength (rest L)))
      )
)

Функция возвращает ошибку «Unbound variable: LLENGTH», и я не понимаю, почему или как я могу это исправить .. Какие-либо предложения ?

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

Когда вы определяете функцию с помощью вызова (defun function name (parameters)), вы должны затем вызвать функцию, набрав:

(function name (parameters))

Возможно, вы просто набрали:

function name (parameters)

Выполнение этого будетполучите сообщение об ошибке, которую вы получаете, поэтому убедитесь, что вы заключили все утверждение в круглые скобки.

2 голосов
/ 06 декабря 2010

В вашем коде несколько ошибок.

Прежде всего, list функция создает новый список , не проверяя, является ли он списком. Вам нужна функция listp - «p» в конце означает «предикат».

Во-вторых, (progn (+ (llength (first L)) 1) (llength (rest L)) не увеличит счетчик. progn выполняет выражения одно за другим и возвращает результат последнего выражения, остальные результаты просто отбрасываются. progn там в основном для побочных эффектов. На самом деле вам нужно добавить все три компонента: 1, чтобы указать один найденный список, результат применения функции к первому элементу и результат для применения ко всем остальным. Итак, эта строка должна быть:

((listp (first L)) (+ (llength (first L)) (llength (rest L)) 1))

Может существовать больше ошибок, пожалуйста, будьте внимательны, чтобы правильно сделать отступ в коде - это действительно помогает уменьшить их.

0 голосов
/ 06 декабря 2010
(defun llength (list)
  (cond 
    ((null list) 0)
    ((listp (first list))
     ;; 1 + the count of any sub-lists in this sub-list + the 
     ;; count of any sub-lists in the rest of the list.
     (+ 1 (llength (first list))
        (llength (rest list))))
    (t (llength (rest list)))))

Тест:

> (llength '(1 2 3 4))
0
> (llength '(1 2 (3 4)))
1
> (llength '(1 2 (3 (4))))
2
> (llength '(1 2 (3 4) (5 6) (7 8) (9 (10 (11)))))
6
...