Лисп/Введение: различия между версиями
Содержимое удалено Содержимое добавлено
Ramir (обсуждение | вклад) Нет описания правки |
Ramir (обсуждение | вклад) мНет описания правки |
||
Строка 7:
(if A
(let ((part (distill (lambda (x) (< x (car A))) (cdr A))))
(append (qsort (car part)) (cons (car A) (qsort (
Отсюда полностью видны синтаксические правила Лиспа и понятие [[#Синтаксис|''формы''
;<code>DEFUN</code>:— служебная конструкция присвоения выбранному символу (<code>distill</code>) значения заданной следом функции. Сперва идёт список принимаемых функцией параметров: в нашем случае это функция <var>f</var> и последовательность <var>A</var>.
Затем идёт список ''форм'', в совокупности определяющих данную функцию. Значение последней в списке формы по умолчанию становится выводом самой функции. В нашем списке лишь один элемент-форма:
;<code>
;<code>REMOVE-IF-NOT</code>:
;<code>REMOVE-IF</code>: (то же, но без «не»). Для обеих этих функций первым аргументом идёт функция-предикат, вторым аргументом — последовательность для фильтровки.
{{info|Заметим сразу, что эту, определёную нами функцию <code>
;<code>qsort</code>: Традиционное имя для процедуры, реализующий [[w:Быстрая сортировка|алгоритм «быстрой сортировки» Хоара]].<ref>Для введения в алгоритмы упорядочения читайте статью в «Потенциале»: [[Алгоритмы сортировки]].</ref> Именно этот алгоритм мы здесь, поспешно и оттого довольно небрежно, реализуем для примера.
;<code>IF</code>: Синтаксический сахар для особого понятия ''условного оператора'' (<code>COND</code>), впервые введённого именно в Лиспе ;-)
;<code>LET</code>: Напомнит многим об операторе присваивания в языке Бейсик (заимствованном, в конечном счёте, из Лиспа.) Важно заметить, что последующий затем отступ <small>(традиционный, в два пробела)</small> выделяет те вычисления, что помещены в '''''лексическую область видимости''''' ('''''контекст'''''), определённую оператором LET. Этой областью обладает лишь одна переменная
;<code>part</code>: Произвольное имя вспомогательной (идеально локальной,
;<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>. То есть, имя функции вносится в скобки, а запятые опускаются.
[[Категория:Лисп| ]]
|