Простейшие функции на 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)