Ваше наблюдение связано с тем, что объект имеет более одного представления. В Common Lisp программа чтения (которая читает код и читает выражения) анализирует текст на структуру и данные. Когда это данные, модуль записи может распечатать их снова, но он не будет точно знать, как данные были представлены при первоначальном считывании. Модуль записи будет печатать один объект только одним способом, следуя значениям по умолчанию и настройкам, даже если существует несколько представлений. для этого объекта.
Как вы заметили, nil
, NIL
, nIL
, NiL
,..., 'nil
, 'NIL
, ()
и '()
читаются как один и тот же объект. Я не уверен, что стандарт точно диктует, каким должно быть представление по умолчанию, поэтому я предполагаю, что некоторые реализации выбирают одно из NIL
, nil
или, может быть, даже ()
.
С cons представление зависит от того, является ли cdr
cons/nil или нет:
'(a . nil) ; ==> (a)
'(a . (b . c)) ; ==> (a b . c)
'(a . (b . nil)) ; ==> (a b)
С помощью чисел читатель может получить подсказки о том, какую базу вы используете. Если в тексте не используется база, он будет использовать любое *read-base*
:
(let ((*read-base* 2)) ; read numbers as boolean
(read-from-string "(10 #x10)")) ; ==> (2 16)
#x
говорит читателю интерпретировать остальное как шестнадцатеричное значение. Теперь, если бы ваша база печати была равна 4, ответ на приведенный выше вопрос был бы визуализирован как (2 100)
.
Подводя итог... Одно значение в Common Lisp может иметь несколько хороших представлений, и все они будут давать одно и то же значение. То, как печатается значение, будет зависеть как от реализации, настроек, так и от аргументов функций, которые их производят. Ни то, что он принимает в качестве значения, ни различные способы, которыми он может визуализировать значение, ничего не говорят о том, как значение на самом деле хранится внутри.
person
Sylwester
schedule
27.02.2015