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

есть ли различия между тем, что в Common Lisp вы бы назвали атомом, и символом?

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

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

4 ответов


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

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


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

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

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


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

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

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


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

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