Процедура list?
проверяет, является ли список правильным (вложенные cons-ячейки, заканчивающиеся значением null
), поэтому мы должнырассмотрим три случая:
(define (my-list? x)
(cond ((null? x) #t) ; empty list
((pair? x) (my-list? (cdr x))) ; pair, advance recursion
(else #f))) ; atom
Значение null
считается пустым списком.Если мы в паре, то мы продвигаемся по cdr
, вызывая процедуру рекурсивно.Если это не null
, ни пара, это атом.Это будет охватывать крайние случаи, такие как:
(my-list? 42)
=> #f
(my-list? (cons 1 2))
=> #f
и вернет true
для правильных списков:
(my-list? '())
=> #t
(my-list? (cons 1 (cons 2 '())))
=> #t