Материалы (8) (1115035), страница 2
Текст из файла (страница 2)
Значением этой формыявляется имя определяемой функции:(defun f (x1 x2 … xk) e) => F,k≥0Определение функций(defun List2 (x y) (cons x (cons y ()))) => LIST2(List2 '(A) 'B) => ((A) B)(List2 'Y 'X) => (Y X)(List2 T '(С (Е))) => (T (С (Е)))(defun InsNew(x)(cons(car x)(cons 'NEW (cdr x)))) => INSNEW(InsNew '(F (T E ())С)) => (F NEW (T E NIL) С)Определение функцийЛисповский список является функциональнымвызовом только в двух случаях:Первый случай – обращение к функции поимени: (f e1 … ek), k≥0; этот случай включаетобращение к функции let.Второй случай – лямбда-вызов, или обращение кбезымянной функции: (λ e1 … ek), где λ –лямбда-выражение, k≥0.Подчеркнём, что первый элемент списка-вызовафункции не вычисляется лисп-интерпретатором,он представляет собой либо явно заданное имяфункции, либо явно заданное определяющеевыражение функции.Встроенные функцииФункции обработки списков:28 обычных функций от одного аргумента caar,cadr, cdar, cddr, caaar, caadr, …, cdddar, cddddr,действие которых эквивалентно определённойсуперпозиции функций car и cdr(caddr '(Р (С Е) В ())) => В ,(caadr '(Р (С Е) В ())) => С .Встроенные функцииФункция-конструктор list, составляющая списокиз значений своих аргументов.
Эта функцияотносится к особым, поскольку у неё может бытьпроизвольное число аргументов, но при этом всеаргументы вычисляются.(list '(NUM К) ()'C) => ((NUM К) NIL C)(list '(В) 'А) => ((В) А)(list '(А) '(В)) => ((А)(В)) ,но (cons '(А) '(В)) => ((А) В).Встроенные функцииАрифметические функции(+ 12 -67 34) => -21(* 1 2 3 4) => 24(- -15 -3) => -12(- -56) => 56(/ -12 3) => -4Встроенные функцииАрифметические предикаты(= 1/4 0.25) => T(/= 1/4 (- 0.3 0.05)) => NIL(< 7 (+ 12 3)) => T(<= 7 (+ -12 3)) => NIL(evenp 25) => NIL(evenp (+ -15 -3)) => TВстроенные функции(defun eql (x y)(cond ((numberp x)(cond ((numberp y)(= x y))(T NIL)))(T (eq x y))))Встроенные функцииПредикаты типа(defun null (x) (eq x NIL))(null '(М)) => NIL(null (cdr '(М))) => TФункция-предикат listp выдает значение T, еслизначением её аргумента является список, и NIL впротивном случае.(listp 'А ) => NIL(listp (car '((А)) )) => T(listp (caar '((А)))) => NIL(listp (cdr '((a)))) => TВстроенные функцииПредикаты типа(numberp (car '(12 A S))) => T(numberp (cadr '(12 A S))) => NIL(symbolp (car '(12 A S))) => NIL(symbolp (cadr '(12 A S))) => T(symbolp '(12 A S)) => NIL(numberp '(12 A S)) => NIL(symbolp ()) => TВстроенные функцииЛогические функции(defun not (x) (eq x NIL))(not NIL) => T(not T) => NIL(not '(B ())) => NIL(and e1 e2 … en), n≥0.(or e1 e2 … en), n≥0Встроенные функцииПри n=0 значения функций: (and)=>T, (or)=>NIL.Примеры :(and (atom T)(= 1 23)(eq 'A 'B)) => NIL(and (< 12 56) (atom 'Z) '(A S)) => (A S)(or (eq 'A 'B) (atom 'Y) ()) => Т(or (eq 'A 'B) 'Y '(T R)) => Y(or (atom '(Y V)) () (eq 'A 'B)) => NILРекурсивные функцииНапишем функцию, вычисляющую длину списка(Length '(A (5 6) D)) => 3Рекурсивные функцииНапишем функцию, вычисляющую длину списка(Length '(A (5 6) D)) => 3(defun Length (L)(cond ((null L) 0)Рекурсивные функцииНапишем функцию, вычисляющую длину списка(Length '(A (5 6) D)) => 3(defun Length (L)(cond ((null L) 0)(T (+ 1 (Length (cdr L))) )))Рекурсивные функцииВ качестве следующей задачи запрограммируемфункцию-предикат Member от двух аргументовА и L: (Member А L)Рекурсивные функцииВ качестве следующей задачи запрограммируемфункцию-предикат Member от двух аргументовА и L: (Member А L)(defun Member (А L)(cond ((null L) NIL)((eq A (car L)) T)(T (Member A (cdr L)) )))Рекурсивные функцииЕщё одна задача – построение рекурсивнойфункции Append от двух аргументов-списков L1 иL2.
Функция соединяет (сливает) элементыверхнего уровня обоих списков в один список,например:(Append '(Q R T) '(K M)) => (Q R T K M)(Append '(B (A)) '((C C) () D))=> (B (A) (C C) NIL D)Рекурсивные функции(defun Append(L1 L2)(cond ((null L1) L2)(T (cons (car L1)(Append (cdr L1) L2)))))Рекурсивные функции(defun Append(L1 L2)(cond ((null L1) L2)(T (cons (car L1)(Append (cdr L1) L2)))))ЗаданиеНаписать функцию RevAppend, меняющуюпорядок элементов в сцепленных списках напротивоположныйЛисп-программаТипичная лисп-программа включает:определения новых функций на базе встроенныхфункций и других функций, определённых в этойпрограмме;вызовы этих новых функций для конкретныхзначений их аргументов.(read) => атом или спсок -- функция ввода(prin1 e) -- вычисляет e и печатает результатРекурсивное программирование(Reverse '(A (B D) C)) => (C (B D) A)(defun Reverse (L)(cond ((null L) NIL)(T (append (Reverse (cdr L))(cons (car L) NIL) )) ))Рекурсия может быть косвеннойРекурсивное программирование(Reverse '(A (B D) C)) => (C (B D) A)(defun Reverse (L)(cond ((null L) NIL)(T (append (Reverse (cdr L))(cons (car L) NIL) )) ))Рекурсия может быть косвеннойРекурсивное программирование( (defun MemberS (A L)(cond((atom L)(eql A L)) ; дошли до атома(T(or(MemberS A(car L));поиск в левомподдереве(MemberS A(cdr L));поиск в правомподдереве)) ))Ищет элемент A в списке L.
Параллельнаярекурсия.