Подробнее о комментарии @Sylwester, пожалуйста, дайте более подробное объяснение.
Если вы пишете (f '((1 2 3))
то функция f
называется, l
обязан ((1 2 3))
, и результатом является применение функции внутреннего (lambda (ff) (cond ...))
к значению (f (car l))
.
Для выполнения этого приложения сначала (f (car l))
оценивается для получения значения, и так как l
связан с ((1 2 3))
, его car
является (1 2 3)
.
Таким образом, f
применяется к списку (1 2 3)
, который привязан к l
в рекурсивном порядке. Эта оценка снова означает, что f
должна применять внутреннюю функцию (lambda (ff) (cond ...))
к значению (f (car l))
, то есть к (f 1)
.
Процесс reapeated, l
связан этот раз 1
, и снова f
следует применять внутреннюю функцию (lambda (ff) (cond ...))
к значению (f (car l))
, но, так как l
теперь 1
, функция пытается оценить (car 1)
, который производит найденную вами ошибку.
Вы вызываете '(f (car l))' безоговорочно, и результат должен быть готов до применения лямбда. '(f (car l))' будет, конечно, делать то же самое, чтобы вы закончили с '(f (car (car (car (car (car .....))))))' до тех пор, пока аргументы не будут длиннее список, в котором вы получите сообщение об ошибке. – Sylwester