Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Вкратце:

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

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

Ответ 4

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

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

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

Ответ 5

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

(define (atom? s)
    (not (pair? s)))

Ответ 6

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

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

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

Ответ 7

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

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

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