Функциональное программирование




Функции. Базовые функции 2 - часть 2


    * ( insert-second 'b '( a c d ) )

    ( a b c d )

3.2 Передача параметров. Глобальные и локальные переменные.

В Лиспе передача параметров производится в функцию по значе-
нию, т.е. формальный параметр в функции связывается с тем же значением, что и значение фактического параметра.


Изменение значения формального параметра не оказывает влияния на значения фактических параметров. После вычисления функции, созданные на это время связи параметров ликвидируются и происходит возврат к тому состоянию, которое было до вызова функции . Параметры функции являются локальными переменными , и имеют значение только внутри функции.

        Например:

          * ( defun f ( x ) ( setq x ' new ) ) ; меняет значение x

          f


          * ( setq x ' old )

          old

          * x

          old

          * ( f x )

          new


        Еще пример:

          * ( defun double ( num ) ( * num 2 )

          double

          * ( setq num 5 )

          5

          * ( double 2 )

          4

          * num

          5

3.3 Свободные переменные.

Если в теле функции есть переменные, не входящие в число ее формальных параметров - они называются свободными. Значения свободных переменных остается в силе после ее выполнения.

        Например:

          * ( defun f1 ( y ) (setq x 3 ) )

          f1

          * ( f1 5 )

          3

          * x

          3

3.4 Расчет сопротивления цепи.

До тех пор пока мы не рассмотрели определение функций, мы не могли приступить к написанию программ на ЛИСПЕ. Теперь можно рассмотреть простейшую.

Задача:

Написать программу расчета сопротивления цепи.

r1=r2=r3=10

            Последовательное соединение (serial)

            R = R1 + R2

            функция (s_r R1 R2)

            Определение:

            ( defun s_r ( R1 R2 ) (+ R1 R2 ) )

            Параллельное соединение (parallel)

            R = ( R1 * R2 ) / ( R1 + R2 )

            функция ( p_r R1 R2 )

            Определение:

            ( defun p_r ( R1 R2 ) ( / ( * R1 R2 ) ( + R1 R2 ) ) )

            Расчет:

            * (s_r 10 ( p_r 10 10 ) )

            15

Усложним цепь:

r1=r2=r3=r4=10

Расчет:

*( p_r 10 ( s_r 10 ( p_r 10 10 ) ) )

и т.д.

3.5 Дополнительные функции обработки списков.

3.5.1 APPEND.

Функция APPEND объединяет два и более списков в один.

( APPEND < список - 1 > < список - 2 > )

<




Содержание  Назад  Вперед