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




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


Read-eval-print цикл

loop { read evaluate print)

В Лиспе сразу читается , затем вычисляется (evaluate) значение функции и выдается значение.

Пример :

* ( + 2 3 )

5

 

 

 

Иерархия вызовов.

В вводимую функцию могут входить функциональные подвыражения :

* (* ( + 1 2 ) ( + 3 4 ))

21

 

 

Блокировка QUOTE.

В некоторых случаях не требуется вычисления значений выражений, а требуются само

выражение. Если прямо ввести * ( + 2 3 ) , то 5 получится как значение. Но можно понимать ( + 2 3 ) не как функцию, а как список. S-выражения, которые не надо вычислять,

помечают для интерпретатора апострофом " ' " (quote).

QUOTE - специальная функция с одним аргументом, которая возвращает в качестве значения этот аргумент.

 

 

 

* ' ( + 2 3 )

( + 2 3 )

Или

* ' y

y

 

 

 

* ( quote ( + 2 3 ) )

( + 2 3 )

* ( quote y )

y

Вместо апострофа можно использовать функцию QUOTE.

* ' ( a b ' ( c d ) )

(a b ( quote c d ) )

Апостроф автоматически преобразуется в QUOTE.

 

 

* ( quote ' y )

( QUOTE Y )

* '' y

( QUOTE Y )

* ( QUOTE QUOTE )

QUOTE

 

 

 

Перед константами не надо ставить апостроф, так как число и его значение совпадают.

* ' 3.17

3.17

* ( + ' 2 3 )

5

* t

T

* ' t

T

* ' nil

NIL

 

 

 

/FONT>.4 Функция EVAL.

  • Функция EVAL обеспечивает дополнительный вызов интерпретатора Лиспа.
  • При этом вызов может производится внутри вычисляемого S-выражения.
  • Функция EVAL позволяет снять блокировку QUOTE.

  •  

     

    * ( quote ( + 1 2 ) )

    ( + 1 2 )

    * ( eval ( quote ( + 1 2 ) ) )

    3

    quote и eval действуют во взаимно противоположенных

    направлениях и аннулируют эффект друг друга.

    Примеры:

    * ( setq x ' ( a b c ) )

    ( a b c )

    * ' x

    x

    * x

    ( a b c )

    * ( eval ' x )

    ( a b c )

    EVAL - это универсальная функция Лиспа, которая может вычислить любое правильно составленное s-выражение.

     

     

     

    <




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