Простейшие функции на Lisp

advertisement
Простейшие функции на Lisp
Проект «Программирование
на Lisp»
Ввод значений переменных с
клавиатуры.
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Для ввода используется стандартная функция чтения READ. Если прочитанное выражение необходимо сохранить
для дальнейшего использования, то вызов READ должен быть аргументом какой-либо формы, например,
присваивания SET.
Для вывода можно использовать стандартную функцию PRINT. Необходимо отметить, что PRINT имеет как
собственное значение, так и побочный эффект – печать этого значения.
Пример: Вычисление квадрата числа, введенного с клавиатуры и выведение результата.
(set 'p (read));
(set 'r (* p p));
(print r);
>> 11
121 121
Двойной вывод в данном случае происходит потому что специально не задана область выведения результата, а по
умолчанию вывод происходит в окне RPL платформы Eclipse, где также осуществляется выведение текущих
результатов в программе. Поэтому при работе в данном окне использование команд вывода не является
необходимым.
(set 'p ( read));
(set 'r (* p p));
>> 7
49
Условная функция if
• В Lisp возможно использование традиционной
функции IF, которая имеет общий формат:
(IF <условие> <форма 1> <форма 2>)
В том случае, когда условие не равно NIL, функция
возвращает значение формы 1, иначе – формы 2.
Пример: Нахождение максимального из двух чисел.
(if (> 5 4) (set 'max 5) (set 'max 4))
5
Нахождение полупериметра треугольника
((lambda (a b c) (if (= 0 a b c) (NIL) (/(+ a b c) 2) ))2 2 2)
3
Циклы
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Бесконечный цикл
(loop do ...)
Цикл с предусловием
(loop while условие do ...)
Цикл с постусловием
(loop do ... until условие)
Цикл for - next для диапазона целых чисел с инкрементом на 1
Цикл for - next для диапазона целых чисел с убыванием на 1
Пример 1. Вычисление факториала
(defun factorial (n)
(if (= n 0) 1 (* n (factorial (- n 1))) ) )
(loop for i from 0 to 16
do (format t "~D! = ~D~%" i (factorial i)) )
Пример 2. Вычисление чисел Фибоначчи
(defun fibonacci (n)
(if (< n 3) 1 (+ (fibonacci (- n 1)) (fibonacci (- n 2))) ))
(loop for i from 1 to 16
do (format t "~D, " (fibonacci i))
finally (format t "...~%"))
(loop for i from 1 to 10 do ...)
(loop for i from 1 to 10 by -1 do ...)
Вывод надписи
• (format t "Я изучаю Lisp!~%")
•
Я изучаю Lisp!
• NIL
Вывод результата, полученного
ранее заданной функцией
•
•
•
•
•
(format t "~D, " (f))
(defun rrt (x)(* x x 5)
)
(format t "~D, " (RRT 10))
500, NIL
Определение новых функций с
помощью DEFUN
• Функция DEFUN позволяет соединять символ (название) с
лямбда-выражением (функцией) и символ начинает
представлять определенные этим выражением вычисления.
Значением этой формы является имя новой функции. После
именования функции ее вызов осуществляется по имени и
параметрам.
• Запись: (defun f (форма1 форма2) ...)
• Пример:
• Задание функции, составляющей список:
• (defun list1 (x y) (cons x (cons y nil)))
• LIST1
•
Вызов заданной функции: (f x y); функции без аргументов
(f).
• (list1 'c 'n)
• (C N)
Download