12.4 Арифметические операции

Каждая из функций в этом разделе в качестве аргументов принимает числа. Применение какой-либо из них к нечисловому аргументу является ошибкой. Каждая из них работает со всеми типами чисел, автоматически приводя типы для различных аргументов, если не указано иное.

[Функция] + &rest numbers

Данная функция возвращает сумму всех аргументов. Если аргументов не было, результатом является 0.


[Функция] - number &rest more-numbers

Функция - при использовании с одним аргументом возвращает отрицательное значение для этого аргумента.

Функция - при использовании с более чем одним аргументом вычитает из первого аргумента все остальные и возвращает результат. Например, (- 3 4 5)  -6.


[Функция] * &rest numbers

Функция возвращает произведение всех аргументов. Если вызывается без аргументов, тогда возвращает 1.


[Функция] / number &rest more-numbers

Функция / при использовании с более чем одним аргументом производит деление первого аргумента на все остальные значения и возвращает полученный результат.

Ноль может использоваться только для первого аргумента.

Для одного аргумента / возвращает обратное значение. В таком случае ноль в первом аргументе недопустим.

Если математическое отношение двух целых чисел не является целым числом, / вернёт дробный тип. Например:

(/ 12 4)  3
(/ 13 4)  13/4
(/ -8)  -1/8
(/ 3 4 5)  3/20

Для целочисленного деления используйте одну из функций floor, ceiling, truncate или round.

Если один из аргументов является числом с плавающей точкой, тогда применяются правила обработки чисел с плавающей точкой.


[Функция] 1+ number
[Функция] 1- number

(1+ x) является тем же самым, что (+ x 1). (1- x) является тем же самым, что (- x 1). Следует отметить, что короткое имя может ввести в заблуждение: (1- x) не значит то же, что и 1 −x. ______________________

Заметка для реализации: Compiler writers are very strongly encouraged to ensure that (1+ x) and (+ x 1) compile into identical code, and similarly for (1- x) and (- x 1), to avoid pressure on a Lisp programmer to write possibly less clear code for the sake of efficiency. This can easily be done as a source-language transformation.

___________________________________________________________________________________________________________

[Макрос] incf place [delta]

[Макрос] decf place [delta]

Значение обобщённой переменной place увеличивается (incf) или уменьшается (decf) на значение формы delta и затем присваивается переменной place. Результатом формы является присвоенное значение. Форма place может быть любой формой подходящей для setf. Если форма delta не указана, тогда число в place изменяется на 1. Например:

(setq n 0)
(incf n)  1 and now n  1
(decf n 3)  -2 and now n  -2
(decf n -5)  3 and now n  3
(decf n)  2 and now n  2

Результат (incf place delta) примерно эквивалентен

(setf place (+ place delta))

за исключением того, что в последнем случае place вычисляется дважды, тогда как incf гарантирует, что вычисление place будет выполнено только один раз. Более того, для некоторых форма place incf может быть эффективнее чем setf.

X3J13 voted in March 1988 to clarify order of evaluation (see section 7.2).

[Функция] conjugate number

Функция возвращает комплексное сопряжение с числа number. Сопряжением некомплексного числа является само число. Для комплексного числа z,

(conjugate z)  (complex (realpart z) (- (imagpart z)))

Например,

(conjugate #C(3/5 4/5))  #C(3/5 -4/5)
(conjugate #C(0.0D0 -1.0D0))  #C(0.0D0 1.0D0)
(conjugate 3.7)  3.7


[Функция] gcd &rest integers

Функция возвращает наибольший общий делитель всех аргументов, которые в свою очередь должны быть целыми числами. Результатом gcd всегда является неотрицательное целое число. Если передан только один параметр, то возвращается его абсолютное значение (модуль). Если ни один параметр не был передан, gcd возвращает 0. Для трёх и более аргументов,

(gcd a b c ... z)  (gcd (gcd a b) c ... z)

Несколько примеров использования gcd:

(gcd 91 -49)  7
(gcd 63 -42 35)  7
(gcd 5)  5
(gcd -4)  4
(gcd)  0


[Функция] lcm integer &rest more-integers

Функция возвращает наименьшее общее кратное для аргументов, которые в свою очередь должны быть целыми числами. Результатом lcm всегда является неотрицательное целое число. Для двух аргументов, не являющихся нулями,

(lcm a b)  (/ (abs (* a b)) (gcd a b))

Если один или оба аргумента является нулём.

(lcm a 0)  (lcm 0 a)  0

Для одного аргумента, lcm возвращает абсолютное значение этого аргумента (модуль). Для трёх и более аргументов,

(lcm a b c ... z)  (lcm (lcm a b) c ... z)

Примеры использования:

(lcm 14 35)  70
(lcm 0 5)  0
(lcm 1 2 3 4 5 6)  60

lcm, вызванная без аргументов, возвращает 1.

(lcm)  1