Визначення функцій в Ліспі
T )
В другій колонці написано предикат LISTP, який розпізнає додатково порожній список (повертає істину). Перше завдання є умовним, хвіст якого порожній. Його можна проінтерпретувати так: перевірити об’єкт obj на порожній список, і якщо він є таким, передати як результат функції істину. Немає потреби писати: ((NULL obj) T), оскільки це те ж саме, що і ((NULL obj)). Останнім завданням цих предикатів є атом Т. Це означає, що якщо жодне з умовних завдань не виконане (лише за цієї умови керування програмою дійде до останнього завдання), то як результат функції повернути Т. Для другого визначення функції LISTP маємо:
$ (LISTP ‘tree)$ (LISTP ‘())$ (LISTP ‘(q w e r t y))
NIL TT
Для кращого розуміння роботи тіла функції та простих і умовних завдань розглянемо функцію sm та результати, які вона буде генерувати при певних вхідних значеннях:
$ (DEFUN sm (lst)$ (sm ‘())$ (sm ‘(q w e))
((NULL lst) 10 1)112
(SETQ b 2)
((CDR lst) 12)$ (sm ‘(i))$ (sm ‘g)
(SETQ b 3) )33
Як бачимо, після виконання простого завдання керування завжди передається наступному завданню (якщо таке є). Якщо предикат умовного завдання істинний, то виконується його хвіст і повертається результат останнього виразу хвоста.
Вмонтована функція (LIST x1 ... xn) утворює та видає список, елементами якого є x1,..., xn. Якщо аргументи не задані, результатом буде NIL.
$ (LIST ‘a ‘b ‘c ‘d)$ (LIST ‘a ‘(b c) ‘d)$ (LIST)
(a b c d)(a (b c) d)NIL
Напишемо функцію MEMBER, яка має два аргументи: nam - символ та lst - список і яка повинна перевірити чи належить символ списку. Інтуїтивно необхідно порівняти символ з першим елементом списку, потім з другим елементом і так далі. Проблема в такому розв’язку виникає в тому, що ми не знаємо наперед довжини списку. А якщо ми і знаємо цю довжину, і якщо вона велика, то тіло функції буде дуже великим. Така функція буде мати приблизно такий вигляд (перший стовпчик):
$ (DEFUN MEMBER (nam lst)$ (DEFUUN MEMBER (nam lst)
((EQL nam (FIRST lst)))((NULL lst) NIL)
((EQL nam (SECOND lst)))((EQL nam (CAR lst)) T)
((EQL nam (THIRD lst)))(MEMBER nam (CDR lst)) )
((EQL nam (THIRD (CAR lst))))
. . . . . . . . . . . . . . .