Атомы Лиспа и Эрланга, символы рубина и схемы.Насколько они полезны? - PullRequest
61 голосов
/ 02 февраля 2011

Насколько полезна возможность иметь тип данных atom в языке программирования?

Некоторые языки программирования имеют понятие атома или символа для представления своего рода константы. Есть несколько различий между языками, с которыми я сталкивался (Lisp, Ruby и Erlang), но мне кажется, что общая концепция одинакова. Я интересуюсь дизайном языка программирования, и мне было интересно, какое значение имеет наличие атомного типа в реальной жизни. Другие языки, такие как Python, Java, C #, кажутся вполне успешными без него.

У меня нет реального опыта работы с Lisp или Ruby (я знаю синтаксис, но не использовал ни в реальном проекте). Я использовал Erlang достаточно, чтобы привыкнуть к этой концепции.

Ответы [ 13 ]

2 голосов
/ 02 февраля 2011

В Ruby символы часто используются в качестве ключей в хешах, так часто, что в Ruby 1.9 даже вводится сокращение для создания хеша. То, что вы ранее написали как:

{:color => :blue, :age => 32}

теперь можно записать как:

{color: :blue, age: 32}

По сути, они представляют собой нечто среднее между строками и целыми числами: в исходном коде они напоминают строки, но со значительными различиями. Одни и те же две строки фактически являются разными экземплярами, в то время как одни и те же символы всегда являются одним и тем же экземпляром:

> 'foo'.object_id
# => 82447904 
> 'foo'.object_id
# => 82432826 
> :foo.object_id
# => 276648 
> :foo.object_id
# => 276648 

Это влияет как на производительность, так и на потребление памяти. Кроме того, они неизменны. Не предназначен для изменения один раз при назначении.

Практическим правилом было бы использование символов вместо строк для каждой строки, не предназначенной для вывода.

Хотя это может показаться неуместным, большинство редакторов с подсветкой кода окрашивают символы по-другому, чем остальная часть кода, делая визуальное различие.

1 голос
/ 02 февраля 2011

Атомы подобны открытому перечислению, с бесконечными возможными значениями, и не нужно ничего объявлять заранее.Вот как они обычно используются на практике.

Например, в Erlang процесс ожидает получения одного из нескольких типов сообщений, и наиболее удобно пометить сообщение атомом.Большинство других языков используют перечисление для типа сообщения, а это означает, что всякий раз, когда я хочу отправить сообщение нового типа, я должен добавить его в объявление.

Кроме того, в отличие от перечислений, наборы значений атомовможно комбинироватьПредположим, я хочу контролировать состояние процесса Erlang, и у меня есть какой-то стандартный инструмент мониторинга состояния.Я могу расширить свой процесс для ответа на протокол сообщений о состоянии , а также на другие типы сообщений .Как решить эту проблему с перечислениями?

enum my_messages {
  MSG_1,
  MSG_2,
  MSG_3
};

enum status_messages {
  STATUS_HEARTBEAT,
  STATUS_LOAD
};

Проблема в том, что MSG_1 равен 0, а STATUS_HEARTBEAT также равно 0. Когда я получаю сообщение типа 0, что это?С атомами у меня нет этой проблемы.

Атомы / символы - это не просто строки с постоянным сравнением времени:).

1 голос
/ 02 февраля 2011

Атомы обеспечивают быстрое тестирование на равенство, так как они используют идентичность. По сравнению с перечисляемыми типами или целыми числами они имеют лучшую семантику (зачем вы представляете абстрактное символическое значение числом в любом случае?), И они не ограничены фиксированным набором значений, таких как enums.

Компромисс состоит в том, что их создание дороже, чем буквенные строки, поскольку системе необходимо знать все существующие экземпляры, чтобы поддерживать уникальность; это стоит времени в основном для компилятора, но это стоит памяти в O (число уникальных атомов).

...