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

Содержимое удалено Содержимое добавлено
Новая: <div style="max-width:60em;margin:1em auto 0 4%;"> Если вы уже знакомы с каким-нибудь императивным языком типа Си или Perl, то п...
(нет различий)

Версия от 02:56, 21 сентября 2008

Если вы уже знакомы с каким-нибудь императивным языком типа Си или Perl, то понятие функции в лиспе может показаться странным, но оно значительно ближе к математическому понятию функции, чем функции Си, которые по сути являются процедурами. Функция в лиспе есть однозначное отображение множества исходных данных на множество ее значений. Так же, как и в математике, у функции может быть любое количество аргументов, их может не быть совсем, но обязательно должно быть хотя бы одно значение. В лиспе принята префиксная запись функций, но в отличие от привычного f(x,y) -> z это пишется как (f x y) -> z. Не смотря на внешнее неудобство понимание такой записи - дело привычки, и через некоторое время вы увидите его преимущества.

Чистом функциональном лиспе (pure lisp) функции не должны обладать побочным эффектом, то есть изменять значения глобальныз переменных. В противном случае при нескольких вызовах одной функции могут быть получены разные значения, что противоречит концепции функционального программирования. В современных диалектах лиспа есть функции с побочными эффектами - так называемые псевдофункции. Порой они необходимы, но их использование должно быть предельно ограничено.

Определение функции основано на лямда-исчислении. Исходный вариант записи лямда-выражения, предложенный его автором Черчем, выглядит как . Лисп-запись выглядит так: (lambda (x1 x2 ...) fn). x1, x2 ... - формальные параметры, то есть они могут быть безболезненно заменены на другие без изменении значения лямбда-выражения. Благодаря этому лямбда-выражения способны обеспечить больший уровень абстракции, чем обычные функции.