Как понятие «атом» - это то, что не может быть разбито на более мелкие части.Число 42 является атомом, список (42 43) не является атомом, поскольку он содержит две меньшие части (а именно числа 42 и 43).Поскольку пустой список не содержит меньших частей, по этой логике он является атомом.
Теперь давайте попробуем реализовать предикат atom?
, который определяет, является ли его ввод атомом.
(define (atom? x)
(cond
[(number? x) #t]
[(symbol? x) #t]
[(char? x) #t]
...
[else #f]))
Здесь ... необходимо заменить тестом для каждого атомарного типа данных, поддерживаемого реализацией.Это может быть длинный список.Чтобы избежать этого, мы можем попытаться быть умными:
(define (atom? x)
(not (list? x)))
Это будет правильно возвращать false для непустых списков и true для чисел, символов и т. Д. Однако это будет возвращать false для пустого списка,
Поскольку авторы книги должны определить термин «атом» (слово не фигурирует в стандарте языка), они, возможно, выбрали вышеприведенное простое определение.
Обратите внимание, что определение «не в списке» вводит в заблуждение, когда язык содержит другие сложные структуры данных, такие как векторы и структуры.Если я правильно помню, единственная составная структура данных, обсуждаемая в книге, это списки.