Scheme и Clojure не имеют предиката типа атома - это задумано?

Common LISP и Emacs LISP имеют предикат типа атома. В Scheme и Clojure его нет. http://hyperpolyglot.wikidot.com/lisp

Есть ли для этого конструктивная причина - или это просто не важная функция для включения в API?


person hawkeye    schedule 12.08.2010    source источник
comment
Помимо общего любопытства, есть ли причина, по которой вы нашли бы для него применение? Объект — это либо атом, либо составной объект, и вас обычно интересует, что это за составной объект, верно?   -  person Joel J. Adamson    schedule 12.08.2010
comment
Некоторые схемы поставляются с различными мелочами, такими как атом? предопределены для вашего удобства. Например, [Petite] Chez Scheme содержит самые простые функции, которые вы ожидаете.   -  person erjiang    schedule 22.08.2010


Ответы (7)


В Clojure предикат атома не так важен, потому что Clojure делает упор на различные другие типы (неизменяемых) структур данных, а не фокусируясь на минус-ячейках/списках.

Это также может вызвать путаницу. Как вы ожидаете, что эта функция будет вести себя, например, при задании хэш-карты, набора или вектора? Или объект Java, представляющий некоторую сложную изменяемую структуру данных?

Также название «атом» используется для чего-то совершенно другого — это один из основных механизмов параллелизма Clojure для управления общим, синхронным, независимым состоянием< /а>.

person mikera    schedule 12.08.2010

В Clojure есть функция coll? (коллекция?), которая (как бы) обратна atom?.

person Stuart Sierra    schedule 12.08.2010

В книге Маленький интриган atom? определяется как следует:

(define (atom? x)
  (and (not (pair? x))
       (not (null? x))))

Отметив, что null не считается атомом, как предлагали другие ответы. В упомянутой книге atom? активно используется, в частности, при написании процедур, которые имеют дело со списками списков.

person Óscar López    schedule 02.03.2012
comment
схема действительно странный язык, он имеет ноль вместо nil, а нуль не является атомом. схема должна быть самым странным диалектом лиспа, кроме javascript. - person Alfgaar; 26.12.2017
comment
Я думаю, вы должны добавить «(не (процедура? x)» к этому определению, если только вы не считаете, что процедура является атомом. - person Alfgaar; 26.12.2017

Во всех стандартных библиотеках IronScheme, реализующих R6RS, мне никогда не понадобилась такая функция.

В итоге:

  • Это бесполезно
  • Достаточно легко написать, если вам это нужно

Что в значительной степени соответствует минималистичному подходу Scheme.

person leppie    schedule 12.08.2010

В Схеме все, что не является pair, является atom. Поскольку Scheme уже определяет предикат pair?, предикат atom? не нужен, так как его очень просто определить:

(define (atom? s)
    (not (pair? s)))
person Vijay Mathew    schedule 13.08.2010
comment
Схема не знает разницы между парой и списком? Или это изменило концепцию пары? В Лиспе нет такой вещи, как пара, только атомы, минусы и списки. Насколько я знаю, пара состоит только из двух вещей. Таким образом, вы можете сказать, что список из двух элементов является парой, но не список из трех или более элементов. Но рассматривать список из двух элементов как пару концептуально не очень хорошо. Лучше отличать одно от другого. - person Alfgaar; 26.12.2017
comment
@Alfgaar: Это не совсем так. Список — это рекурсивная структура данных: каждый список — это либо пустой список, либо пара, в которой второй элемент, cdr, сам является списком. Список из 100 элементов по-прежнему является парой, состоящей из цепочки пар. - person Chris Vine; 28.12.2017

Это тривиальная функция:

(defun atom (x)
   (not (consp x)))

Он используется при обработке списков, когда диалект Lisp использует conses для построения списков. Есть некоторые 'Lisp'ы, для которых это не так или не имеет значения.

person Rainer Joswig    schedule 12.08.2010

Атом может быть символом, символом, числом или нулевым значением.

(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?; тем не менее, число можно рассматривать как тип класса (другие предикаты относятся к подтипам числа), тогда как атом - нет (по крайней мере, на схеме).

Примечание: типы классов: типы, принадлежащие к определенному классу вещей. Пример:

число, целое, действительное, рациональное, символ, процедура, список, вектор, строка и т. д.

person Alfgaar    schedule 26.12.2017