Глава 3. Стили функционального программирования
Кубенский А.А. Функциональное программирование. Глава 3. Стили функционального программирования. Основные примитивные функции в ЛИСПе Арифметические и логические функции: PLUS, MULT, LE, EQ, AND Специальные функции: COND, QUOTE, LET Функции обработки списков: CAR, CDR, CONS (CONS 'A '(B C)) ? (A B C) (CONS 'A (CONS 'B NIL)) ? (A B) (CAR '(A B C)) ? A (CDR '(A B C)) ? (B C) (CDR '(A)) ? NIL (CONS '(A B) '(C D)) ? ((A B) C D) (CAR (CDR '(A B C D))) ? B (CADDR '(A B C D))) ? C (CONS 'LAMBDA (CONS '(X) '((PLUS X 1)))) ? (LAMBDA (X) (PLUS X 1)) Функции высших порядков в ЛИСПе: (DEFINE MAP (LAMBDA (F L) (COND (L (CONS (F (CAR L)) (MAP F (CDR L)))) (T NIL) ))) (MAP '(LAMBDA (X) (PLUS X 1)) '(1 3 8)) ? (2 4 9) Кубенский А.А. Функциональное программирование. Глава 3. Стили функционального программирования. Функции как значения Функциональное значение – это либо встроенная функция, либо список, первым атомом которого является специальный атом LAMBDA. Например, (LAMBDA (X) (MULT 2 X)) Если функция применяется к аргументу, то формальные параметры «связываются» со значением аргумента, поэтому, например, выражение ((LAMBDA (X) (MULT 2 X)) 3) при вычислении выдает значение 6. Как происходит вычисление, если в теле функции используются «глобальные» атомы? (LAMBDA (X) (MULT Y X)) Два возможных подхода: статический: значения «глобальных» атомов фиксируются в момент определения функции (в момент «исполнения» функции LAMBDA). динамический: значения «глобальных» атомов определяются во время работы функции. Разница может проявиться, если функция определена в одном контексте, а исполняется в другом. В некоторых (старых) версиях ЛИСПа для «фиксации» контекста применялись специальные функции, например, если лямбда-выражение передавалось в качестве аргумента в другую функцию, то можно было использовать специальную функция FUNCTION вместо QUOTE.