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

Содержимое удалено Содержимое добавлено
Новая: Лингвистические термины вроде «предложений», «лексем», «морфем», «фонем» — выделяют закономерные и ...
 
правки
Строка 2:
 
Избегая инопланетную [[w:Форма Бэкуса — Наура|запись Бэкуса — Наура]], определим внешний вид Лиспа по-русски:
 
*'''Программа на Лиспе''' — это ''символьное выражение''.
*'''Символьное выражение''' — это ''атом'' либо ''cписок''.
*'''Список''' выделяется круглыми скобками.</code>
** Внутри списка — либо ничего, либо последовательность ''символьных выражений''.
*'''Атом''' — это ''число'' либо ''символ''
* '''Число''' выражается привычно: 1, 2, 2.71828, 1/2… разве только в десятичных дробях дробная часть отделяется точкой.
* '''Символ''' в Common Lisp’еLisp обозначается любым рядом знаков без <ttcode>().;'`</ttcode> и без пробельных символов (табуляции, пробела, перевода строки…)
 
Число — это фундаментальное понятие, обращаться с которым вы научились в школе. «Список» — название для также знакомого и фундаментального понятия ряда, последовательности. А «символ» что такое? Такое же фундаментальное понятие, и столь же необходимое в <s>Лиспе</s> любом языке, как «число» или «последовательность» в математике. Это может быть «переменная», «ссылка», «оператор», «особая мудрёная конструкция»… но всё это понятия не фундаментальные, а вспомогательные, контекстно навееваемые. Тут как с человеческими языками:
 
* Есть некие <big><em>''знаки</em></big>'' со смыслами.
* Знаки можно как-то совмещать.
* Совмещение как-то образует составной смысл.
** Часто важна очерёдность знаков.
** Часто можно совмещения совмещать и дальше.
 
Подобно «знакам» (лексемам, морфемам и фонемам в человеческих языках), ''символы'' в Лиспе могут означать, представлять, делать самые разнообразные вещи.
 
== Формы ==
 
<source lang=lisp>4</source>
 
По данному выше определению: 4 — это ''число'', стало быть ''атом'', стало быть ''символьное выражение'', стало быть ''программа на Лиспе''. Программа ничего значительного не делает;, лишь ''возвращает'' число 4. Попробуем другое символьное выражение:
 
<source lang=lisp>(+ 2 2)</source>
 
«Сумма 2 и 2». В Лиспе ''символ'' <code>+</code> несёт тот же смысл, что и слова «плюс», «сложить», «сумма» в русском.
 
 
===Префиксная запись===
 
Сразу после запуска clisp вы увидите приглашение к вводу выражений для вычисления
 
Попробуем вычислить несколько выражений
{{console|
> (+ 1 2)
3
> (+ 5 (- 4 3))
6
}}
 
{{console|> (+ 1 2)
Для людей не привыкших к префиксной форме то, что мы только что ввели должно показаться несколько странным. Однако, легко догадаться что в первом случае мы вычисляли выражение "1 + 2 = 3", а во втором "5 + (4 - 3) = 6". Если вы имеете опыт программирования на других языках (скажем на Си или Паскале), то на самом деле вы имеете опыт обращения и с префиксной записью.
3
 
> (+ 15 2(- 4 3))
6}}
 
Для людей не привыкших к префиксной форме то, что мы только что ввели должно показаться несколько странным. Однако, легко догадаться что в первом случае мы вычисляли выражение "<math>1 + 2 = 3"</math>, а во втором "<math>5 + (4 - 3) = 6"</math>. Если вы имеете опыт программирования на других языках (скажем на Си или Паскале), то на самом деле вы имеете опыт обращения и с префиксной записью.
 
Рассмотрим небольшой пример на языке Си.
 
<code style="display:block;width:30em;margin:0 auto;"><source lang="c">
<source lang="c">
int plus (x, y) {
return x + y;
Строка 52 ⟶ 61 :
return plus(5, minus (4, 3));
}
</source></code>
 
Видно, что когда программист на Си определяет использует некоторую функцию он пользуется именно префиксной записью. Отличие заключается лишь в том что Си -программист пишет "<code>plus (5, minus (4, 3))"</code>, а лисп Лисп-программист "<code>(plus 5 (minus 4 3))"</code>. Т.е.То есть, имя функции вносится в скобки, а запятые опускаются.
 
[[Категория:Лисп]]