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




Let. Циклические предложения - часть 2


Рассмотрим пример.

Необходимо написать функцию которая вводит два значения. Если это числа функция печатает их сумму и разность.

Если хотя бы одно не является числом, печатается nil.

* (defun s-d ()
(prog (x y); локальные переменные
(print '(type number))
(setq x (read))
(and (not (numberp x)) (return nil))
(print '(type number))
(setq y (read))
(and (not (numberp y)) (return nil))
(print (+ x y))
(print (- x y))))

* (s-d)
(type number)8
(type number) (1)
nil

return возвращает результат для prog.


Если return не встретился - результат prog будет nil .

* (s-d)
(type number)8
(type number)1
9
7
nil

Если локальных переменных нет записывается (prog ()...)


5.3 Дополнительные функции печати

PRINT печатает значение аргумента без пробела и перевода на другую строку:

* (progn (print 1) (print 2) (print 3))
123

СТРОКИ - последовательность знаков заключенная в кавычки.

"string"

СТРОКА - специальный тип данных в лиспе. Это атом, но не может быть переменной. Как у числа значение строки сама строка.


* "(+ 1 2)"
"(+ 1 2)"

Строки удобно использовать для вывода с помощью оператора PRINC.

PRINC печатает строки без "".

PRINC печатает аргумент без пробела и перевода строки

Пример

* (progn (setq x 4) (princ " x = ")
(prin1 x) (princ " m "))
x = 4 m

" m ": значение последнего аргумента.

PRINC обеспечивает гибкий вывод.

TERPRI производит перевод строки. Как значение возвращает nil.

* (progn (setq x 4) (princ "xxx ") (terpri) (princ "xox "))
xxx
xox
" xox"

5.4 Циклические предложения

Циклические вычисления в лиспе выполняются или с помощью итерационных (циклических) предложений

или рекурсивно.

Познакомимся вначале с циклическими предложениями


5.4.1 LOOP

Предложение LOOP реализует бесконечный цикл

(LOOP форма1 форма2 .....)

в которoм формы вычисляются до тех пор, пока

не встретится явный оператор завершения RETURN.




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