Лисп/Функции: различия между версиями
Содержимое удалено Содержимое добавлено
Oleg4280 (обсуждение | вклад) {{BookCat}} |
АРГО-67 (обсуждение | вклад) викификация, орфография |
||
Строка 1:
<div style="max-width:60em;margin:1em auto 0 4%;">
Если вы уже знакомы с каким-нибудь алголоподобным языком типа [[Язык Си в примерах|Си]] или Пёрла, то понятие '''функции''' в Лиспе может показаться странным, но оно значительно ближе к математическому явлению функции, чем «функции» Си, которые вернее бы назвать более процедурами. Функция в Лиспе есть однозначное отображение множества исходных данных на множество её значений. У функции может быть произвольно много аргументов,
<source lang=c>plus(2,2)</source>
несколько видоизменяется в силу отсутствия синтаксиса: идентификатор (
<source lang=lisp>(plus 2 2)</source>
В чистом функциональном лиспе (являющемся строгим подмножеством любого из диалектов) функции не должны обладать [[w:
Определение функции основано на [[w:Лямбда-исчисление|лямбда-исчислении]]. Исходный вариант записи лямбда-выражения, предложенный его автором [[w:Алонзо Чёрч|Чёрчем]], выглядит как
<math>\lambda(x_1,x_2...)fn</math>. Лисп-запись выглядит так: <code>(lambda (x1 x2 ...) fn)</code>. x1, x2
Например, сумму квадратов на языке лямбда-выражений можно определить как <code>(lambda (x y) (+ (* x x) (* y y)))</code>. Вызов лямбда-функции с конкретными значениями <code>((lambda (x y) (+ (* x x) (* y y))) 2 3) => (+ (* 2 2) (* 3 3)) => 13</code> может быть сделан единожды, при желании вызвать такую функцию еще раз необходимо повторить запись еще раз. Это неудобно. Было бы удобнее написать нечто типа (сумма-квадратов 2 3). Это возможно, если вы предварительно определите функцию сумма-квадратов.
Строка 16:
x y))
</source>
…но не пугайтесь: для
<source lang="lisp">
(defun сумма-квадратов (x y)
Строка 37:
(block сумма-квадратов (+ (* x x) (* y y)))>
</source>
Штрих перед названием функции поставлен неслучайно. В Лиспе любое имя соответствует некоторому символу. Имя функции
<source lang="lisp">
>> (symbol-function сумма-квадратов) ; это выдаст ошибку: переменной сумма-квадратов не присвоено значение
|