Язык Common LISP и LISP Emacs имеют предикат типа атома. Scheme и Clojure не имеют его. http://hyperpolyglot.wikidot.com/lisp
Существует ли причина дизайна этого - или разве это - просто не существенная функция для включения в API?
В Clojure предикат atom не так важен, поскольку Clojure делает упор на различные другие типы (неизменяемых) структур данных, а не на ячейки/списки.
Это также может привести к путанице. Как, по вашему мнению, должна вести себя эта функция, если ей дать, например, хэшмап, набор или вектор? Или объект Java, представляющий сложную изменяемую структуру данных?
Также название "атом" используется для чего-то совершенно другого - это один из основных механизмов параллелизма Clojure для управления общим, синхронным, независимым состоянием.
Это тривиальная функция:
(defun atom (x)
(not (consp x)))
Она используется при обработке списков, когда диалект Лиспа использует conses для построения списков. Есть некоторые "Лиспы", для которых это не так или не является центральным.
На схеме все, что не является парой
, является атомом
. Поскольку Scheme уже определяет пару предикатов ?
, предикат atom?
не нужен, поскольку его очень просто определить:
(define (atom? s)
(not (pair? s)))
В Clojure есть функция coll?
(collection?), Которая (в некотором роде) является обратной для atom?
.
Во всех стандартных библиотеках IronScheme, реализующих R6RS, мне никогда не требовалась такая функция.
Вкратце:
Что в значительной степени соответствует минималистическому подходу Scheme.