В статье подробно рассказывается как обрабатываются функции в языке Лисп.
Автор:
Написал: artish   Дата: 2008-09-08 21:46
Комментарии: (0)   Рейтинг:
Пока комментариев нет
Вы знаете что такое функция? Давайте представим ее в виде такой черной коробочки, с входами и выходами:
рисунок 1 с черной коробочкой
где входами являются аргументы функции, а выходами - результат. Это возможно, потому что в общем случае нас не интересует КАК функция вычисляет, нам важно ЧТО она вычисляет. Рассмотрим операцию суммирования:
рисунок функции (+ 1 2)
 С точки зрения данных - числа 2 и 3 попадают в функцию, и число 5 из нее выходит. С точки зрения функции, функция "+" получает числа 2 и 3 как аргументы, и выдает 5 как результат. С точки зрения программиста, мы вызываем функцию "+" и передаем ей аргументы 2 и 3, и функция возвращает значение 5. Думаю,  это ясно. Правда, не стоит забывать, что порядок аргументов функции весьма важен. Простейший пример - деление:
рисунок с функцией деления
Ну, примем для простоты, что верхняя стрелочка отражает первый аргумент, вторая сверху - второй, и т. д. Соответственно, функция "/" считает первый аргумент  делимым, второй - делителем.
Думаю, пришло время попробовать что нибудь чуть более сложное.
Язык лисп содержит все необходимые функции - +, - , *, /, и т. д. Но что делать, если нам нужно что нибудь особенное? Правильно, надо это запрограммировать. Предположим, что нам нужна функция, которая увеличивает свой аргумент на единицу. (а так же предположим, что в лиспе такой функции нет :)). Мы можем получить искомый результат, используя функцию "+", у которой один аргумент - всегда единица:
Здесь мы определили (продекларировали, создали) новую функцию под названием ADD1.
Давайте вычислим 5*6-3:
Здесь вывод одной функции является вводом для другой. Таким образом мы можем "каскадировать" бесконечное количество функций, получая очень сложные результаты.

Тут мы незаметно перешли к основному  принципу функционального программирования.

Давайте немного отвлечемся. Как бы Вы описали порядок перехода дороги? Скорее всего так:
1. подойти к краю дороги.
2. посмотреть налево.
3. посмотреть направо.
4. дойти до другого тротуара.
Это программа. В чистом виде. Точнее в алгоритмическом виде. мы перечисляем порядок действий, необходимый для получения результата. С философсоской точки зрения программа (при алгоритмическом представлениии) - это набор действий, т.е. " делай раз, делай два, делай три и получишь требуемое". Но это не единственный способ понимания термина " программа".Другой вариант - представить программу как "черную коробочку", в которую попадают исходные данные, а из нее выходит результат. Существуют и другие варианты представления программы. Например, объектное, когда программа представляется как набор взаимодействующих объектов. Но это совсем другая история.

Давайте нашу задачу (о переходе дороги) перепишем в функциональном представлении:
Мы просто напишем функцию "перейти-дорогу", аргументами для нее будет наличие/отсутствие  машин справа и слева. А проверять это наличие.отсутсвие будет  функция "посмотреть-в-сторону", для которой, в свою очередь, аргументами будут константы "право" и "лево":

рисунок функции перейти дорогу.
(Такой способ программирования весьма интересен, порой позволяет достичь невероятной выразительности программы, краткости кода. Вобщем, в спорах о преимуществах и недостатках функционального программирования сказано много слов, сломано не меньше копий и выбито немало зубов. Я очень рекомендую Вам освоить такой стиль программирования, хотя лисп и не заставляет ему (этому стилю) следовать.)

Конечно, это очень примитивный пример.

Давайте теперь посчитаем что нибудь реальное. Ну, например, квадратное уравнение:
Квадратное уравнение записывается в виде: Аx2+Bx+C=0 где A,B и C - числа, A не равно нулю.
Классическая формула  для нахождения его корней: x1=(-B-sqrt(B2-4AC))/(2A) и x2=(-B+sqrt(B2-4AC))/(2A) где sqrt - квадратный корень числа.

решение квадратного уравнения в квадратиках

Ну как? По-моему, круто :) Небольшие пояснения к диаграмме, тьфу, программе. 0-В это "унарный минус", т.е. -В. Умножение с тремя входами - 4, А и С можно было разбить на два, но в лиспе некоторые двухаргументные функции допускают использование их со многими аргументами, например, те же "+", "-","*".С точки зрения математики, в этом нет ничего необычного. Просто вместо 4*А*С, мы пишем - "перемножить 4, А, С" (помните о префиксной записи в лиспе?)


Онлайн :

0 пользователь(ей), 35 гость(ей) :




Реклама на сайте: