В чем разница между атомом и символом в 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 символ очень похож на переменную в других языках, хотя и более тяжелый (это не просто пустой кусок памяти, достаточно большой, чтобы содержать значение). Это, как правило,intern
ed, поэтому на него можно ссылаться по имени, хотя можно иметь анонимные символы (например, память в C, на которую вы можете ссылаться только указателем).
атом-это некоторое значение, которое не является cons
ячейки. Символ-это атом, а также число, строка и многое другое. Наиболее распространенное использование cons
ячейки составляют списки, хотя их можно использовать и другими способами.