Существует разница между формой (lambda (x) ...)
и формой (lambda x ...)
.
Обратите внимание на разницу между этими двумя примерами:
;; Example 1.
(define f
(lambda (x)
(if (list? x)
(display "x is a list!")
(display "x is not a list"))))
(f 1) ; Displays "x is not a list".
;; Example 2.
(define g
(lambda x
(if (list? x)
(display "x is a list!")
(display "x is not a list"))))
(g 1) ; Displays "x is a list!".
Форма (lambda x ...)
позволяет лямбде принимать любое количество аргументов, причем все аргументы помещаются в список, связанный с x
в теле лямбды. то есть x
- это список аргументов.
Вот почему, когда вы даете g
список (например, (g '(1 2 3))
), x
будет '((1 2 3))
(список списков).
Чтобы исправить ваш код:
(define last-element-on-list
(lambda (l) ; <- ATTENTION.
(cond ((null? l) '()) ; FIXME: raise error instead.
((null? (cdr l)) (car l))
(else (last-element-on-list (cdr l))))))
Подробнее о lambda
вы можете прочитать в The Racket Guide . В частности, смотрите раздел 4.4.1 (Объявление аргумента отдыха).