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




Логические функции. Управляющие структуры - часть 4


a

* (gcar 'a)

nil

4.4 Ввод и вывод информации.


До сих пор в определяемых функциях ввод и вывод результатов осуществлялись в процессе диалога с интерпретатором.

Интерпретатор читал вводимое пользователем выражение, вычислял его значение и возвращал его пользователю.

Теперь мы рассмотрим специальные функции ввода и вывода Лиспа.

4.4.1 READ.

          READ отличается от операторов ввода-вывода других языков пpогpаммиpования, тем что он обрабатывает вводимое выражение целиком, а не одиночные элементы данных.


      Вызов функции осуществляется в виде:

          ( READ )

      функция без аргументов.

        Как только интерпретатор встречает READ, вычисления приостанавливаются до тех пор пока пользователь не введет какой-либо символ или выражение.

          * ( READ )

          new - выражение пользователя

          new - значение функции.

READ не указывает на ожидание информации. Если прочитанное выражение необходимо для дальнейшего использования, то READ должен быть аргументом какой либо формы, которая свяжет полученное выражение:

      * ( setq x ' ( read ) )

      ( + 1 2 ) - вводимое выражение

      ( + 1 2 ) - значение

      * x

      ( + 1 2 )

      * ( eval x )
      3


Еще один пример:



      ( defun tr ( arg )

      ( list ( + arg ( read ) ) ( read ) ) )

        * ( tr 8 )

        14

        cat

        ( 22 cat)



4.4.2 PRINT.

          Функция PRINT - это функция с одним аргументом. Она выводит значение аргумента на монитор, а затем возвращает значение аргумента.


        Для вывода выражений можно использовать функцию print.

        ( PRINT < arg >)

          print перед выводом аргумента переходит на новую строку,

          а после него выводит пробел.

            * ( print ( + 2 3 ) )

            5 - вывод

            5 - значение

    print и read - псевдофункции, у которых кроме значения есть побочный эффект.

    Значение функции - значение ее аргумента.

    Побочный эффект - печать этого значения.

Это не значит, что всегда две строки. Только когда print на высшем уровне, чего практически не бывает.

              Пример:

              * ( setq row ' ( x x x ) )

              ( x x x )


      * ( print ( cdr row ) )

      ( x x ) - печать

      ( x x ) - значение

        * ( cons 'o (

        print ( cdr row ) ) )

        ( x x ) - печать

        ( o x x ) - значение

<




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