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

Содержимое удалено Содержимое добавлено
Нет описания правки
мНет описания правки
Строка 7:
(if A
(let ((part (distill (lambda (x) (< x (car A))) (cdr A))))
(append (qsort (car part)) (cons (car A) (qsort (cadrcar (cdr part))))))))</source>
 
Отсюда полностью видны синтаксические правила Лиспа и понятие [[#Синтаксис|''формы'' (о них подробнее — [[#Синтаксис|ниже]]). ИСмысл хотяже синтаксиспрограммы тотсоставлен очень прост, весьма удобным будет применение среды разработки, уважающей твёрдые традиции форматирования Лисп-кода. Читайте приложение {{ССЫЛКА|/Рабочая среда}}.так:
 
;<code>DEFUN</code>:— служебная конструкция присвоения выбранному символу (<code>distill</code>) значения заданной следом функции. Сперва идёт список принимаемых функцией параметров: в нашем случае это функция <var>f</var> и последовательность <var>A</var>.
Разобравшись со структурой, целиком изучим смысл программы:
 
;<code>DEFUN</code>:Cлужебная конструкция «присвоить символу значение определённой следом функции.»
Затем идёт список ''форм'', в совокупности определяющих данную функцию. Значение последней в списке формы по умолчанию становится выводом самой функции. В нашем списке лишь один элемент-форма:
;<code>distillLIST</code>:ПроизвольноеЭто имяфункция, функциивозвращающая список, берущейсоставленный произвольныйиз списокпереданных <code>A</code>ей иэлементов. затемВ выдающийданном списокслучае (операторэто <code>LIST</code>)два изопять-таки двух списковсписка: в первом идут элементы исходного списка<var>A</var>, будучи переданные (произвольной) функции <code>f</code> возвращающие <code>nil</code> («пустота»); во втором списке прочие элементы исходного списка;. вВ иных отношениях последовательность элементов не нарушается. Функции, перебирающие элементы — это:
;<code>REMOVE-IF-NOT</code>:(«убрать, если элементы не удовлетворяют функции-предикату») и
;<code>REMOVE-IF</code>: (то же, но без «не»). Для обеих этих функций первым аргументом идёт функция-предикат, вторым аргументом — последовательность для фильтровки.
{{info|Заметим сразу, что эту, определёную нами функцию <code>splitdistill</code> можно было бы и не определять под собственным именем, ибо её вызов в qsort единственен. Но мы всё же выделяем её, ибо её гибкая функциональность может быть полезна в иных задачах, нежели один только <code>qsort</code>. Ах, да:}}
 
;<code>qsort</code>: Традиционное имя для процедуры, реализующий [[w:Быстрая сортировка|алгоритм «быстрой сортировки» Хоара]].<ref>Для введения в алгоритмы упорядочения читайте статью в «Потенциале»: [[Алгоритмы сортировки]].</ref> Именно этот алгоритм мы здесь, поспешно и оттого довольно небрежно, реализуем для примера. <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>;
Строка 95 ⟶ 96 :
Видно, что когда программист на Си определяет использует некоторую функцию он пользуется именно префиксной записью. Отличие заключается лишь в том что Си-программист пишет <code>plus (5, minus (4, 3))</code>, а Лисп-программист <code>(plus 5 (minus 4 3))</code>. То есть, имя функции вносится в скобки, а запятые опускаются.
 
[[Категория:Лисп| ]]