Урок 7. Функции COND и IF в LISP

LISP   16 декабря 2012  Автор статьи:  

В данном уроке мы рассмотрим две функции COND и IF. Они являются операторами условия, т.е с помощью них вы сможете создать ветвление вашего алгоритма. Рассмотрим сигнатуру этих функций более подробно:

(cond (предикат-1 результат-1)
(предикат-2 результат-2)
...
(предикат-n результат-n))

Из данного примера мы видим, что функция cond в LISP является некоторым аналогом функции case из других языков программирования. На вход она принимает n — пар предикат — значение. Как выполняется COND? Сначала просматриваются все предикаты в порядке следования, и если хоть один из них истинный, то cond возвращает результат, связанный с этим предикатом. Если ни один предикат не был истинным, то она вернет NIL. Рассмотрим следующий пример:

(setq x 1)
(cond ((listp x) (car x))
((atom x) x));1

Так как 1 не является списком, но является атомом то выведется просто 1. Теперь попробуем положить в x список:

(setq x '(1 2))
(cond ((listp x) (car x))
((atom x) x));1

Опять вывелась единица, так как взялось значение 1 из списка (1 2). Таким образом с помощью функции cond вы сможете задать зависимость поведения алгоритма от входных данных. Теперь рассмотрим сигнатуру функции if:

(if условие оператор-1 оператор-2)

Таким образом, если вы проверяете только одно условие, то проще пользоваться оператором if. В случае, если условие истинно выполнится первый оператор, иначе второй. Кроме того, в рамках этого урока я хочу рассмотреть как можно составлять сложные условия. Рассмотрим первую функцию, которая поможет нам создавать такие условия, это отрицание. Функция NOT вернет на T NIL, а на NIL — T

(if (not (atom '(1 2))) 'notatom);notatom
(if (not (listp '(1 2))) 'nelist 'list);list

Предикат and аналогичен булевой функции «и». Таким образом проверим находиться ли число в промежутке между 0 и 9:

(if (and (< 0 5) (< 5 9)) 'да);да

or - аналог булевой функции или. Реализуем проверку не принадлежности числа промежутку с 0 до 9:

(if (or (> 0 5) (> 5 9)) 'да 'нет);нет

На самом деле предикаты and и or принимают на вход n-аргументов, результат для and будет истинным, если истинны все его члены, а для or результат будет истинным, если истинен хотя бы один его член. На этом мы закончим наше знакомство с условиями, и со способами их составления и перейдем к рекурсивным функциям.

Научиться программировать

  • на Delphi

  • на Java

  • на C++