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

Содержимое удалено Содержимое добавлено
м «Лисп/Синтаксис» переименована в «Лисп/Первое знакомство»: Обобщение с другой подсекцией.
Нет описания правки
Строка 1:
=Квиксорт=
Вот как можно упорядочить последовательность элементов по возрастанию:
<source lang=lisp>
(defun distill (f A) (list (remove-if-not f A) (remove-if f A)))
(defun qsort (A)
(if A
(let ((part (distill (lambda (x) (< x (car A))) (cdr A))))
(append (qsort (car part)) (cons (car A) (qsort (cadr part)))))))</source>
 
Отсюда полностью видны синтаксические правила Лиспа и понятие ''формы'' (о них подробнее — [[#Синтаксис|ниже]]). И хотя синтаксис тот очень прост, весьма удобным будет применение среды разработки, уважающей твёрдые традиции форматирования Лисп-кода. Читайте приложение {{ССЫЛКА|/Рабочая среда}}.
 
Разобравшись со структурой, целиком изучим смысл программы:
;<code>DEFUN</code>:Cлужебная конструкция «присвоить символу значение определённой следом функции.»
;<code>distill</code>:Произвольное имя функции, берущей произвольный список <code>A</code> и затем выдающий список (оператор <code>LIST</code>) из двух списков: в первом идут элементы исходного списка, будучи переданные (произвольной) функции <code>f</code> возвращающие <code>nil</code> («пустота»); во втором списке прочие элементы исходного списка; в иных отношениях последовательность элементов не нарушается. Функции, перебирающие элементы — это:
;<code>REMOVE-IF-NOT</code>:(«убрать, если элементы не удовлетворяют функции-предикату») и
;<code>REMOVE-IF</code>: (то же, но без «не»). Для обеих этих функций первым аргументом идёт функция-предикат, вторым аргументом — последовательность для фильтровки.
{{info|Заметим сразу, что эту, определёную нами функцию <code>split</code> можно было бы и не определять под собственным именем, ибо её вызов в qsort единственен. Но мы всё же выделяем её, ибо её гибкая функциональность может быть полезна в иных задачах, нежели один только <code>qsort</code>. Ах, да:}}
 
;<code>qsort</code>: Традиционное имя для процедуры, реализующий [[w:Быстрая сортировка|алгоритм «быстрой сортировки» Хоара]].<ref>Для введения в алгоритмы упорядочения читайте статью в «Потенциале»: [[Алгоритмы сортировки]].</ref> Именно этот алгоритм мы здесь, поспешно и оттого довольно небрежно, реализуем для примера. В свою очередь, такой выбор алгоритма — традиционный для вводных курсов в [[:Категория:Функциональное программирование|функциональное программирование]].
;<code>IF</code>: Синтаксический сахар для особого понятия ''условного оператора'' (<code>COND</code>), впервые введённого именно в Лиспе ;-)
;<code>LET</code>: Напомнит многим об операторе присваивания в языке Бейсик (заимствованном, в конечном счёте, из Лиспа.) Важно заметить, что последующий затем отступ <small>(традиционный, в два пробела)</small> выделяет те вычисления, что помещены в лексическую область видимости, определённую оператором LET. Этой областью обладает лишь одна переменная — <code>part</code>:
;<code>part</code>: Произвольное имя вспомогательной (идеально локальной, см. предыдущее <code>LET</code>) переменной, которой присваивается список, — итог «дистилляции» (<code>distill</code>) «обезглавленного» (<code>CDR</code>) списка <var>A</var>; причём критерием (функцией <var>f</var> в <code>distill</code>) служит анонимная функция (определённая через оператор <code>LAMBDA</code>), сравнивающая переданный ей единственный параметр <code>x</code> на предмет его бытия меньше головы (<code>CAR</code>) списка <var>A</var>.
;<code>APPEND</code>:(от латинского ''appendere'' — «на-/привешивать») оператор, связывающий в один линейный список результат (<code>eval</code>… хотя нам это пока не обязательно знать) произвольной последовательности выражений. Выражения в данном случае:
# результат рекурсивного вызова <code>qsort</code>, применённого по отношению к д первого элемента (<code>car</code>) списка <code>part</code>;
# результат связывания в единый список (<code>cons</code> в данном случае делает именно это) двух элементов:
## головы списка <var>A</var>: <code>(car A)</code> и
## результата рекурсивного вызова нашей функции по отношению к первому элементу (<code>CAR</code>) второго списка-элемента в «двойном списке» <code>part</code>.
 
==Синтаксис==
Лингвистические термины вроде «предложений», «лексем», «морфем», «фонем» — выделяют закономерные и типичные конструкции и построения; они изучают ''внешний вид'' языка, а ни в коем случае не ''смысл'' частных выражений на языке.
 
Строка 21 ⟶ 51 :
Подобно «знакам» (лексемам, морфемам и фонемам в человеческих языках), ''символы'' в Лиспе могут означать, представлять, делать самые разнообразные вещи.
 
=== Формы ===
 
<source lang=lisp>4</source>
Строка 33 ⟶ 63 :
 
=== Префиксная запись ===
 
Сразу после запуска clisp вы увидите приглашение к вводу выражений для вычисления