У Scheme и Clojure нет предиката типа атома - это задумано? - PullRequest
13 голосов
/ 12 августа 2010

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

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

Ответы [ 7 ]

14 голосов
/ 12 августа 2010

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

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

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

12 голосов
/ 12 августа 2010

Clojure имеет функцию coll? (collection?), Которая является (своего рода) инверсией atom?.

6 голосов
/ 02 марта 2012

В книге Маленький интриган , atom? определяется следующим образом:

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

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

6 голосов
/ 12 августа 2010

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

В итоге:

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

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

2 голосов
/ 13 августа 2010

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

(define (atom? s)
    (not (pair? s)))
1 голос
/ 13 августа 2010

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

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

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

0 голосов
/ 26 декабря 2017

Атом - это либо символ, символ, число, либо ноль.

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

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

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

...