Лекция 12. Логические и арифметические функции. Работа со списками
Самыми простыми являются арифметические функции. Тип результата арифметической функции зависит от типов ее аргументов. Если все аргументы одного типа, то и результат будет того же типа. Если среди аргументов встречаются как целые, так и вещественные, то результат будет вещественным. Для каждой функции указывается синтаксис, количество и типы аргументов, а также тип возвращаемого значения. Функция + Вычисляет сумму чисел. (+ [< число1> [< число2>... [< числоN> ]... ]]) Типы аргументов: целые или вещественные числа. Тип возвращаемого значения: целое, если все аргументы целые; вещественное, если хотя бы один аргумент является вещественным. Если количество аргументов равно нулю, то возвращается о (целое). Если количество аргументов равно 1, то возвращается значение, равное значению аргумента. Примеры: · (+ 16 30) возвращает 46 · (+) возвращает 0 · (+ -2.0 12.1) возвращает 10.1 · (+ 2 13 1.00) возвращает 16.0
Функция - Вычисляет разность чисел. (- [< число1> [< число2>... [< числоN> ]... ]]) Типы аргументов: целые или вещественные числа. Тип возвращаемого значения: целое, если все аргументы целые; вещественное, если хотя бы один аргумент является вещественным. Если аргументы не заданы, то возвращается о (целое). Если количество аргументов равно 1, то возвращается значение, вычитаемое из 0 (т. е. < число1> с противоположным знаком). Если количество аргументов равно 2 и более, то из первого числа вычитается сумма всех остальных. Примеры: · (- 3) возвращает -3 · (-) возвращает 0 · (– 4 2.1 2.3) возвращает -8.4
Функция * Вычисляет произведение чисел. (* [< число1> [< число2>... [< числоN> ]... ]]) Типы аргументов: целые или вещественные числа. Тип возвращаемого значения: целое, если все аргументы целые; вещественное, если хотя бы один аргумент является вещественным. Если количество аргументов равно нулю, то возвращается о (целое). Если количество аргументов равно 1, то возвращается значение аргумента. Если количество аргументов равно 2 и более, то выполняется перемножение всех аргументов. Примеры: · (* 7) возвращает 7 · (*) возвращает 0 · (* 5 l.1 -0.3) возвращает-1.65 При перемножении больших целых чисел следует учитывать, что произведение может выйти за границы допустимых значений и функция выдаст непредсказуемый результат. Так, выражение (* 12345 987654) вернет значение -692313258, что заведомо не может быть правильным, т. к. произведение положительных чисел должно быть положительным. В таких случаях числа следует перемножать в вещественном виде.
Функция / Вычисляет частное чисел. [/ [< число1> [< число2>... [< числоN> ]... ]]) Типы аргументов: целые или вещественные числа. Тип возвращаемого значения: целое, если все аргументы целые; вещественное, если хотя бы один аргумент является вещественным. Вели количество аргументов равно нулю, то возвращается о (целое). Если количество аргументов равно 1, то возвращается значение аргумента. Если количество аргументов равно 2 и более, то выполняется деление первого аргумента на произведение всех остальных. Примеры: · (/ 81) возвращает 81 · (/) возвращает 0 · (/ 5 1.1 -0.3) возвращает -15.1515 (реальный результат будет получен с максимальной точностью, но на экран обычно выводятся шесть значащих цифр) · (/ 17 23) возвращает 0 · (/ -17 23) возвращает 0 Замечание При делении целых чисел результат должен быть того же типа, что и аргументы, т е целым, поэтому он усекается до целого (путем отбрасывания дробной части). Этим объясняется, что выражения (/ 17 23) и (/ -17 23) возвращают значение 0. Функция 1+ Увеличивает аргумент на 1. (1+ < число>) Тип аргумента: целое или вещественное число. Тип возвращаемого значения: целое, если аргумент целый; вещественное, если аргумент является вещественным. Примеры: · (1+ 2) возвращает 3 · (1+ 5.2) возвращает 6.2 · (1+ -5.2) возвращает-4.2
Функция 1- Уменьшает аргумент на 1. (1- < число>) Тип аргумента: целое или вещественное число. Тин возвращаемого значения: целое, если аргумент целый; вещественное, если аргумент является вещественным. Примеры: (1- 11) возвращает 10 (1- 1.17) возвращает 0.17 Функция ~ Вычисляет дополнение числа до -1 (т. е. сумма возвращаемого значения функции и аргумента < целое> равна-1). (~ < целое>) Тип аргумента: целое число. Тип возвращаемого значения: целое. Примеры: · (~ 9) возвращает -10 · (~ 0) возвращает -1 Функция abs Вычисляет абсолютную величину числа. (abs < число>) Тип аргумента: целое или вещественное число. Тип возвращаемого значения: целое, если аргумент целый; вещественное, если аргумент является вещественным. Примеры: · (abs 3) возвращает 3 · (abs -1.1) возвращает 1.1 · (abs 0.0) возвращает 0.0
Функция rem Получает остаток от деления аргумента < число1> на < число2>, затем остаток от деления результата на < число3> и т. д. (rem [< число1> [< число2>... [< числоN> ]...]]) Типы аргументов: целые или вещественные числа. Тип возвращаемого значения: целое, если все аргументы целые, и вещественное, если хотя бы один из аргументов вещественный. Знак результата определяется знаком первого аргумента (нулевое значение выводится без знака). Если аргументы не заданы, то возвращается о. Если задан только аргумент < чис- ло1>, то возвращается его значение. Примеры: · (rem) возвращает 0 · (rem 3.3) возвращает 3.3 · (rem 204 2) возвращает 0 · (rem 7 3.2) возвращает 0.6 · (rem 8.9 1.54) возвращает 1.2 · (rem 49 11 3) возвращает 2 · (rem -10 -3) возвращает -1 · (rem 10 -3) возвращает 1 · (rem -10 3) возвращает -1
Логические функции В следующих разделах рассматриваются функции логических и условных операций и проверок. Здесь же приводятся функции while и repeat, позволяющие организовывать циклы. Функция = Проверяет равенство аргументов (рекомендуется использовать для чисел или строк). (= < аргумент1> [< аргумент2>... [< аргументN> ]...]) Типы аргументов: любые. Тип возвращаемого значения: логическое (т, если значения аргументов совпали, и nil, если не совпали). Если задан только один аргумент, то возвращается т. Если количество аргументов 2 или больше, то при совпадении значений всех аргументов возвращается т, в противном случае — nil. При сравнении строк т выдается только в случае, когда длины всех строк равны и все строки посимвольно совпадают. При сравнении чисел т выдается также в том случае, когда одни аргументы целые, а другие вещественные, но их значения совпадают. Примеры: · (= -17.0 -17 -17.000) возвращает т · (=1) возвращает т · (= " 33") возвращает т · (= nil) возвращает т (потому что один аргумент) · (= 33 " 33") возвращает nil · (= nil nil) возвращает т · (= nil т) возвращает nil · (= т т) возвращает т · (=т 1) возвращает nil · (= 2 30) возвращает nil · (= " АР8" " Ар8" " АР8") возвращает nil · (= " 2abc" " 2abc") возвращает т. Функция /= Проверяет неравенство аргументов (рекомендуется использовать для чисел или строк). (/= < аргумент1> [< аргумент2>... [< аргументN> ]...]) Типы аргументов: любые. Тип возвращаемого значения: логическое (т, если значения каких-то аргументов не совпали, и nil, если совпали). Если задан только один аргумент, то возвращается т. Примеры: · (/=5) возвращает т · (/= -2.0 -2) возвращает nil · (/= 32 30) возвращает т · (/= " АР8" " Ар8" " АР8") возвращает т · (/= " АР8" " АР8" " АР8") возвращает nil · (/= " 2 abc" " 2abc") возвращает nil Функция < Проверяет расположение аргументов по возрастанию, слева направо. (< < аргумент1> [< аргумент2>... [< аргументN> ]...]) Типы аргументов: числа (целые, вещественные) или строки. Тип возвращаемого значения: логическое (т, если значения аргументов расположены по возрастанию, и nil — в противном случае). Для текстовых строк производится посимвольное сравнение, по возрастанию кодов символов. Если задан только один аргумент, то возвращается т. Примеры: ♦ (< -1) возвращает т ♦ (< -5.81 0) возвращает т ♦ (< 12 12 20) возвращает nil ♦ (< " Х" " Y" " Z") возвращает т ♦ (< " 2abc" " 2abc") возвращает nil ♦ (< " d" " d5") возвращает т ♦ (< " d5") " d") возвращает nil
Функции > < = > = работают анологично.
Функция and Выполняет операцию логического И. (and [< аргумент1> [< аргумент2>... [< аргументN> ]...]]) Типы аргументов: любые. Тип возвращаемого значения: логическое (т, если значения всех аргументов истинны, и nil— в противном случае). К истинным, помимо т, относятся все значения (числовые, строковые и т. д.), кроме nil. Если аргументы не заданы или задан только один аргумент, то возвращается т. Примеры: · (and 11) возвращает т · (and т nil т) возвращает nil · (and т т 4) возвращает т · (and " х" " у" " z") возвращает т Функция or Выполняет операцию логического ИЛИ, (or [< аргумент1> [< аргумент2>... [< аргументN> ].., ]]) Типы аргументов: любые. Тип возвращаемого значения: логическое (т, если значение хотя бы одного аргумента истинно, и nil— в противном случае). К истинным, помимо т, относятся все значения (числовые, строковые и т. д.), кроме nil. Если аргументы не заданы или задан только один аргумент, то возвращается т. Примеры: · (or 11) возвращает т · (or т nil т) возвращает т · (or т т 4) возвращает т · (or " х" " у" " z") возвращает т · (or nil nil nil) возвращает nil Функция not Выполняет операцию логического отрицания. (not < аргумент>) Типы аргументов: любые. Тип возвращаемого значения: логическое (т, если значение аргумента равно nil, и nil — в противном случае). Примеры: · (not т) возвращает nil · (not nil) возвращает т · (not ".NET") возвращает nil · (not -64.64) возвращает nil Функция null Выполняет операцию проверки на nil. (null < аргумент>) Типы аргументов: любые. Тип возвращаемого значения: логическое (т, если значение аргумента равно nil, и nil — в противном случае). Фактически идентична функции not. Традиционно функция null употребляется Для проверки непустоты списков (поскольку пустой список '() идентичен nil) или функций, a not — для аргументов других типов. Примеры: · (null т) возвращает nil · (null nil) возвращает т · (null '()) возвращает т · (null ".NET") возвращает nil
Функция if Выполняет условную операцию типа if-then-else (если-то-иначе). (if < условие> < выражение1> [< выражение2> ]) Типы аргументов: любые. Возвращаемое значение: вычисленное значение аргумента < выражение1>, если значение аргумента < условие> отлично от nil (напомним, что nil в логических операциях используется как " ложь"); значение аргумента < выражение2>, если значение аргумента < условие> равно nil (причем когда < выражение2> опущено, тогда возвращается nil). Используется как условный оператор. Примеры: · (if (> а b) 2 8) возвращает 2, если а> b, и 8 — в других случаях · (if (= x1 х2) (+ x1 102) (* x1 3.04)) возвращает результат вычисления выражения (+ x1 102), если значения x1 и х2 равны; иначе— результат вычисления выражения (* xl 3.04) · (if (< a b) " а< b") возвращает строку " а< b" или nil (т. к. < выражение2> опущено) · (if nil " Initialization") возвращает nil (т. к. < условие> всегда ложно) Если функция if используется для выполнения по условию не одного выражения, а нескольких, то эти выражения следует объединить с помощью функции progn (иначе произойдет синтаксическая ошибка, вызванная неправильным количеством аргументов при обращении к функции if). Функция progn Объединяет несколько (не мене двух) выражений в одно. (progn < выражение1> < выражение2>... [< выражениеЫ> ])
Типы аргументов: любые. Возвращаемое значение — значение последнего из объединенных выражений.
Рассмотрим использование функции progn на таком примере. Пусть при истинности условия (> а b) нужно выполнить выражения (setq с -1), (setq d (-c a b)) и (* d b), а при ложности условия — рассчитать выражения (setq с 2), (setq d (* а b)) и (* d с). Программный код приведен в листинге ниже. Листинг. Пример совместного использования функций if и progn. (if (> a b) (progn (setq с -1) (setq d (-c a b)) (* d b) ); конец progn (progn (setq с 2) (setq d (* a b)) (* d c) ); конец progn ); конец if Для удобства чтения в этом фрагменте текста программы в начале некоторых строк добавлены пробелы, чтобы открывающая скобка оказалась на одном уровне с закрывающей, а внутренние выражения были смещены относительно ближайших внешних на две позиции вправо..
Функция cond Условная операция (типа case в языках программирования высокого уровня) с любым количеством условий. (cond [ (< условие1> [< выражениеN>... ]) [(< условие2> [< выражение21>... ])]...]) Аргументы: любое количество списков, в каждом из которых на первом месте стоит проверяемое условие, а затем следуют выражения, подлежащие выполнению (вычислению), если это условие оказалось истинным. Возвращаемое значение: последнее вычисленное выражение того списка, условие в котором оказалось истинным (если таких списков несколько, то выполняются только выражения первого списка с истинным условием). Если вычисляемое выражение отсутствует (не задано в списке с истинным условием), то возвращается результат вычисления аргумента < условие>. Если аргументы функции cond не заданы или если условия во всех списках оказались ложными, то возвращается nil. Примеры: · (cond) возвращает nil · (cond (nil 55)) возвращает nil · (cond (T 55)) возвращает 55 · (cond ((= 5 6) 55) ((= 7 19) 97)) возвращает nil · (cond ((= 2 2) 100) (т 500000)) возвращает 100 · (cond ((not nil) 534)) возвращает 534 · (cond (80)) возвращает 80 Впрочем, использование функции cond с неполным количеством аргументов не имеет особого смысла. Рассмотрим задачу: переменной mycolor нужно присвоить текстовое значение с наименованием одного из основных цветов AutoCAD (" красный", " желтый", " зеленый", " голубой", " синий") в зависимости от текущего значения переменной сс, которая принимает значения 1, 2, 3, 4, 5. Если значение переменной сс оказалось отличным от перечисленных, то переменной mycolor нужно присвоить " " (пустая строка).
(setq mycolor (cond ((= сс 1) " красный") ((= сс 2) " желтый") ((= сс 3) " зеленый") ((= сс 4) " голубой") ((= сс 5) " синий") (Т " ") ); конец cond ); конец setq
Функция setq присваивает переменной mycolor результат вычисления функции cond. Значение, возвращаемое функцией cond, вычисляется по следующей схеме. Сначала рассматривается список, заданный в качестве первого аргумента — ((= сс 1) " красный") — и проверяется условие, являющееся первым элементом этого списка. Если оказалось, что значение сс равно 1 и, значит, первое условие возвращает " истину", то дальнейшее рассмотрение аргументов функции cond не выполняется, а в качестве возвращаемого значения принимается " красный". Если первое условие не вычислилось как " истина", то проверяется второе условие и т. д. В качестве последнего, шестого, условия стоит т (т. е. " истина" при любых значениях), поэтому если значение переменной сс не совпало с 1, 2, 3, 4, 5, то в качестве возвращаемого значения функции cond будет принято " " (пустая строка).
Функция zerop Проверка числа на нуль. (zerop < число>) Тип аргумента: целое или вещественное число. Возвращаемое значение: т, если < число> равно нулю, и nil — в противном случае. Примеры: · (zerop 0) возвращает т · (zerop 0.0) возвращает т · (zerop 64) возвращает nil
Функция numberp Проверка типа аргумента на числовой, (numberp < аргумент>) Тип аргумента: любой. Возвращаемое значение: т, если < аргумент> является вещественным или целым числом, и nil — в противном случае. Примеры: · (numberp 0) возвращает т · (numberp nil) возвращает nil · (numberp т) возвращает nil · (numberp -220.0) возвращает т · (numberp " 95") возвращает nil · (numberp '(14.39)) возвращает nil (список не относится к числам)
Функция listp Проверка принадлежности аргумента (по типу) к спискам, точечным парам или точечным спискам. (listp < аргумент>) Тип аргумента: любой. Возвращаемое значение: т, если < аргумент> является списком, точечной парой, точечным списком или nil (т. к. пустой список ‘() вырождается в nil), и nil — в противном случае. Примеры: · (listp 0) возвращает nil · (listp 70.2e+23) возвращает nil · (listp " as") возвращает nil · (listp ' (-41.44)) возвращает т · (listp '(8. " Upper")) возвращает т · (listp '(3 5 6. 4)) возвращает т · (listp nil) возвращает т
Функция equal Проверяет равенство двух объектов (для чисел и списков из числовых величин сравнение производится в пределах допуска). (equal < аргумент1> < аргумент2> [< допуск> ]) Типы аргументов: любые. Тип возвращаемого значения: логическое (т, если абсолютная величина разности аргументов не превосходит значения аргумента < допуск>, и nil, если не совпали; когда < допуск> не задан, то его значение считается равным нулю). Для аргументов, не являющихся числами или списками из чисел, < допуск> не используется. Примеры: · (equal -17.0 -17) возвращает т · (equal 6.000 6.005 0.005) возвращает т · (equal " cow" " cow") возвращает т · (equal '(3.00 54.2 0.99) '(3 54.2 1.0) 0.01) возвращает nil (на границе допуска функция может давать неверный результат) · (equal '(3.00 54.2 0.99) '(3 54.2 1.0) 0.011) возвращает т
Функция while Выполняет операцию цикла по многократно проверяемому условию. (while < условие> [< выражение1> [< выражение2>... [< выражениеN]...]]) Типы аргументов: любые. Функция while на каждом шаге цикла вычисляет значение аргумента < условие> и, если это значение " истинно" (т. е. не nil), выполняет (вычисляет) следующие за Условием выражения. Функция прекратит свою работу, когда на некотором шаге аргумент < условие> получит значение nil. Аргумент < условие> должен быть таким, чтобы на каком-то шаге он получил бы значение nil, иначе цикл, организуемый с помощью функции while, станет бесконечным (программа " зациклится"). Возвращаемое значение: значение аргумента < выражениеы> на том шаге, когда последнее вычисление аргумента < условие> выдало значение, отличное от nil. Если уже на первом шаге < условие> имеет значение nil, то функция while ничего не выполняет и возвращает nil. Рассмотрим следующий пример. Пусть надо вычислить значение n! (факториал числа n), т. е. произведение целых чисел от 1 до n. В данном подразделе восклицательный знак используется как знак функции факториала. ;;; (setq n 10); Задайте n (setq i 1 factorial 1) (while (< i n) (setq i (1+ i)) (setq factorial (* factorial i)) ); конец while Функция repeat Выполняет операцию цикла с фиксированным количеством повторений. (repeat < количество> [< выражение1>...]) Типы аргументов: < количество> — целое число (имеют смысл только положительные числа), < выражение1> — любое выражение. После аргумента < выражение1> могут идти другие выражения, которые нужно выполнить внутри цикла. Возвращаемое значение: значение последнего вычисленного выражения. Если < количество> имеет значение 0 или отрицательно или после аргумента < количество> не заданы выражения, то функция repeat возвращает nil
|