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