Common LISP и Emacs LISP имеют предикат типа атома. В Scheme и Clojure его нет. http://hyperpolyglot.wikidot.com/lisp
Есть ли для этого конструктивная причина - или это просто не важная функция для включения в API?
Common LISP и Emacs LISP имеют предикат типа атома. В Scheme и Clojure его нет. http://hyperpolyglot.wikidot.com/lisp
Есть ли для этого конструктивная причина - или это просто не важная функция для включения в API?
В Clojure предикат атома не так важен, потому что Clojure делает упор на различные другие типы (неизменяемых) структур данных, а не фокусируясь на минус-ячейках/списках.
Это также может вызвать путаницу. Как вы ожидаете, что эта функция будет вести себя, например, при задании хэш-карты, набора или вектора? Или объект Java, представляющий некоторую сложную изменяемую структуру данных?
Также название «атом» используется для чего-то совершенно другого — это один из основных механизмов параллелизма Clojure для управления общим, синхронным, независимым состоянием< /а>.
В Clojure есть функция coll?
(коллекция?), которая (как бы) обратна atom?
.
В книге Маленький интриган atom?
определяется как следует:
(define (atom? x)
(and (not (pair? x))
(not (null? x))))
Отметив, что null
не считается атомом, как предлагали другие ответы. В упомянутой книге atom?
активно используется, в частности, при написании процедур, которые имеют дело со списками списков.
Во всех стандартных библиотеках IronScheme, реализующих R6RS, мне никогда не понадобилась такая функция.
В итоге:
Что в значительной степени соответствует минималистичному подходу Scheme.
В Схеме все, что не является pair
, является atom
. Поскольку Scheme уже определяет предикат pair?
, предикат atom?
не нужен, так как его очень просто определить:
(define (atom? s)
(not (pair? s)))
Это тривиальная функция:
(defun atom (x)
(not (consp x)))
Он используется при обработке списков, когда диалект Lisp использует conses для построения списков. Есть некоторые 'Lisp'ы, для которых это не так или не имеет значения.
Атом может быть символом, символом, числом или нулевым значением.
(define (atom? a)
(or (symbol? a)
(char? a)
(number? a)
(null? a)))
Я думаю, что это все атомы, которые существуют, если вы найдете больше, добавьте к conditional expression
. Например, если вы считаете, что строка является атомом, добавьте (string? a), :-). Отсутствие определения атома позволяет вам определить его так, как вы хотите. Ведь Схема не знает, что такое атом.
В Лиспе nil
— это атом, поэтому я сделал null
атомом. nil
также является списком по упрощению nil = (nil . nil)
, так же как целые числа являются рациональными числами по упрощению, 2 = 2/1
, 2 является целым числом, 2/1 является рациональным числом, так как оба равны по упрощению рационального; говорят, что целое число 2 также является рациональным числом. Но предикат списка уже определен в схеме, не о чем беспокоиться.
О вопросе. Насколько я понимаю, в Scheme есть предикаты только для типов классов, атом не является типом класса, атом представляет собой абстракцию, которая включает в себя несколько типов классов. Может быть, это причина. Но пара тоже не является типом класса, но она не включает в себя несколько типов классов, и тем не менее некоторые могут рассматривать пару как тип класса.
Атом означает, что определенная вещь не является составной вещью. Одна из причин не включать такой предикат заключается в том, что язык позволяет вам определять атомарные типы, поэтому множество атомов может становиться все шире и шире, и такой предикат не имеет смысла. Я не знаю, позволяет ли Схема это. Могу только сказать, что все предикаты Scheme (встроенные) специфичны. Вы можете спросить это яблоко?, это апельсин?; но вы не можете спросить это фрукт?. :-). Ну можно, если делать самому. Несмотря на то, что сказано, Scheme имеет общий предикат number?
и числовые предикаты, integer?
, rational?
, real?
; тем не менее, число можно рассматривать как тип класса (другие предикаты относятся к подтипам числа), тогда как атом - нет (по крайней мере, на схеме).
Примечание: типы классов: типы, принадлежащие к определенному классу вещей. Пример:
число, целое, действительное, рациональное, символ, процедура, список, вектор, строка и т. д.