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

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

Существует ли причина дизайна этого - или разве это - просто не существенная функция для включения в API?

13
задан hawkeye 12 August 2010 в 11:41
поделиться

5 ответов

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

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

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

14
ответ дан 1 December 2019 в 18:04
поделиться

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

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

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

1
ответ дан 1 December 2019 в 18:04
поделиться

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

(define (atom? s)
    (not (pair? s)))
2
ответ дан 1 December 2019 в 18:04
поделиться

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

13
ответ дан 1 December 2019 в 18:04
поделиться

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

Вкратце:

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

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

6
ответ дан 1 December 2019 в 18:04
поделиться