Лисп/Типы данных: различия между версиями

Содержимое удалено Содержимое добавлено
Новая: {{wikipedia}} __NOTOC__ __NOEDITSECTION__ <div style="max-width:60em;margin:1em auto 0 4%;"> Итак, типы данных в лиспе. Знакомство с типами дан...
 
мНет описания правки
Строка 1:
{{wikipedia}}
__NOTOC__
__NOEDITSECTION__
<div style="max-width:60em;margin:1em auto 0 4%;">
Действующие диалекты Лиспа способны работать со всеми «обычными» типами данных — от целых чисел до ассоциативных массивов, — на уровне любого передового высокоуровнего языка. При этом трансляторы выдают код, по производительности порой не уступающий тому же для Си. Однако, в Лиспе нет и не будет указателей.
 
Сначала же Лисп оперировал только символами и списками (отсюда и название — <u>Lis</u>p <u>p</u>rocessor).
Итак, типы данных в лиспе.
 
'''Символ — это имя''', состоящее из букв, цифр и[ли] некоторых специальных знаков. Символ обозначает некийпроизвольный объект или явление из реальногоприкладной мираобласти, (давспомогательные иобъекты виртуальноговнутри тоже)программы, или некоторую структуру исходного кода. Имя функции — это тоже символ. УСимвол символавсегда естьимеет значение.
Знакомство с типами данных — это старт в изучении языка.
>> (setq x "value-of-x") => "value-of-x" ; присвоение символу значения
>> (symbol-value x) => value-of-x ; вывод значения символа
 
Особо выделяются логические символы <var>t</var> и <var>nil</var>: t — это «истина», «true».
Лисп был создан как специфический язык для работы со списочными структурами и оперировал только списками и символами (отсюда и название — LISt Processor). Но время не стоит на месте, и лисп середины XX века и лисп XXI века — совершенно разные языки. Современные трансляторы языка способны работать с разнообразными типами данных, при этом они генерируют высокопроизводительный код, не уступающий тому же Си.
>> (symbol-value t) => t
 
А nil, по крайней мере в Common Lisp’е — это «ложь»/«false», <var>null</var>, либо <code>()</code> — пустой список.
И все же основными типами данных в лиспе остаются символы и списки.
 
О подобной многозначности символа <var>nil</var> будет подробно сказано позже, когда будут обсуждаться списки, логические операции, функции ...функции…
'''Символ — это имя''', состоящее из букв, цифр и некоторых специальных знаков. Символ обозначает некий объект или явление из реального мира (да и виртуального тоже). Имя функции — это тоже символ. У символа есть значение.
<source lang="lisp">
>> (setq x "value-of-x") => "value-of-x" ; присвоение символу значения
>> (symbol-value x) => value-of-x ; вывод значения символа
</source>
Особо выделяются логические символы t и nil, значение которых ... <source lang="lisp">>> (symbol-value t) => t </source>
t = true, nil = (or false null () ).
 
Символы t и nil являютсясуть встроенные константами'''константы''' и не могут быть переопределены (действительно - зачем?). Константа - символ, имеющий постоянное значение. Константа определяется (переопределяется) с помощью директивы <code>defconstant</code>.
О подобной многозначности символа nil будет подробно сказано позже, когда будут обсуждаться списки, логические операции, функции ...
t и nil являются константами и не могут быть переопределены (действительно - зачем?). Константа - символ, имеющий постоянное значение. Константа определяется (переопределяется) с помощью директивы defconstant.
 
Вы всегда можете проверить, является ли некий объект символом (предикат symbolp) и узнать его имя (функция symbol-name) или значение (symbol-value). Вы уже могли догадаться об этом, если видели чуть выше маленький клочок кода :-)
Более общим понятием является '''атом''',. атомы =&equiv; спискисимволы +&union; числа.
 
'''Список''' - структура, состоящая из элементов, которыми могут быть атомы или другие списки.
(t (t nil t) t),
(1 (2 (3 4) 5))
(1 (2 (3 4) 5)) - это списки. Список может не содержать элементов вовсе, такой список называется пустым и обозначается () или nil.
 
Список - это фундамент лиспа, ибо в зависимости от интерпретации список может представлять как данные, так и лисповый код. (symbol-value t) - тоже список.