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