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

В чем разница между атомом и символом в Common Lisp?

Существуют ли какие-либо различия между тем, что в Common Lisp вы называете атомом, и символом?

Связаны ли эти различия с другими языками семейства Lisp?

(Я знаю, что атом имеет другое значение в Clojure, но меня интересуют границы того, что является символом.)

4b9b3361

Ответ 1

В Common Lisp атом точно определяется как любой объект, который не является минусом. Подробнее см. http://l1sp.org/cl/atom.

Я не знаю о других языках в семействе Lisp.

Ответ 2

'atom' обычно рассматривается из обработки списка. В Common Lisp что-то является либо непустым списком, либо атомом. В прежние времена атом также назывался "атомным символом", что несколько отличается. Теперь в Common Lisp атомы представляют собой не только символы, но и все остальное, что не является ячейкой cons (примеры: строки, числа, хэш-таблицы, потоки,...).

Если что-то не является атомом (это минус), могут использоваться операции CAR, CDR, FIRST и REST.

Итак, атом - это группа структуры данных. Символ - это определенная структура данных, которая также является атомом.

Ответ 3

В Схеме атом - это все, что не является парой:

> (pair? 1)
#f
> (pair? '(1 2 3))
#t
> (pair? 'a)
#f

Таким образом, символы - это атомы, как числа и строки. атом имеет аналогичное определение в Common Lisp, где функция (atom object) определяется как (not (consp object)).

Ответ 4

В Common Lisp символ очень похож на переменную на других языках, хотя и более тяжеловесный (это не просто пустой кусок памяти, достаточно большой для хранения значения). Обычно это intern ed, поэтому на него можно ссылаться по имени, хотя возможно иметь анонимные символы (подобно памяти в C, на которую вы можете ссылаться только указателем).

Атом - это некоторое значение, которое не является ячейкой cons. Символ - это атом, а также число, строка и многое другое. Наиболее частое использование ячеек cons заключается в составлении списков, хотя их можно использовать другими способами.