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

Emacs Lisp предоставляет традиционные четыре арифметические операции (сложение, вычитание, умножение и деление), а также функции для вычисления остатка и модуля, и функции для прибавления или вычитания 1. За исключением %, каждая из этих функций принимает как целочисленные, так и числа с плавающей запятой в качестве аргументов и возвращает число с плавающей запятой, если хотя бы один аргумент имеет тип с плавающей запятой.

Функция: 1+ число-или-маркер

Эта функция возвращает число-или-маркер плюс 1. Например,

(setq foo 4)
     ⇒ 4
(1+ foo)
     ⇒ 5

Эта функция не аналогична оператору C ++ — она не инкрементирует переменную. Она только вычисляет сумму. Таким образом, если продолжить,

foo
     ⇒ 4

Если вы хотите увеличить значение переменной, вы должны использовать setq, например так:

(setq foo (1+ foo))
     ⇒ 5
Функция: 1- число-или-маркер

Эта функция возвращает число-или-маркер минус 1.

Функция: + &rest числа-или-маркеры

Эта функция складывает свои аргументы. Если аргументы не заданы, + возвращает 0.

(+)
     ⇒ 0
(+ 1)
     ⇒ 1
(+ 1 2 3 4)
     ⇒ 10
Функция: - &optional число-или-маркер &rest ещё-числа-или-маркеры

Функция - служит двум целям: отрицанию и вычитанию. Когда - имеет один аргумент, значением является отрицание этого аргумента. Если аргументов несколько, - вычитает каждый из ещё-чисел-или-маркеров из числа-или-маркера последовательно. Если аргументов нет, результат равен 0.

(- 10 1 2 3 4)
     ⇒ 0
(- 10)
     ⇒ -10
(-)
     ⇒ 0
Функция: * &rest числа-или-маркеры

Эта функция перемножает свои аргументы и возвращает произведение. Если аргументы не заданы, * возвращает 1.

(*)
     ⇒ 1
(* 1)
     ⇒ 1
(* 1 2 3 4)
     ⇒ 24
Функция: / число &rest делители

С одним или несколькими делителями эта функция делит число последовательно на каждый делитель из делителей и возвращает частное. Без делителей эта функция возвращает 1/число, то есть мультипликативное обратное к числу. Каждый аргумент может быть числом или маркером.

Если все аргументы целые, результат является целым числом, полученным путем округления частного в сторону нуля после каждого деления.

(/ 6 2)
     ⇒ 3
(/ 5 2)
     ⇒ 2
(/ 5.0 2)
     ⇒ 2.5
(/ 5 2.0)
     ⇒ 2.5
(/ 5.0 2.0)
     ⇒ 2.5
(/ 4.0)
     ⇒ 0.25
(/ 4)
     ⇒ 0
(/ 25 3 2)
     ⇒ 4
(/ -17 6)
     ⇒ -2

Если вы разделите целое число на целое 0, Emacs сигнализирует об ошибке arith-error (см. Ошибки). В системах, использующих IEEE-754 числа с плавающей запятой, деление ненулевого числа с плавающей запятой на ноль дает положительную или отрицательную бесконечность (см. Основы чисел с плавающей запятой); в противном случае сигнализируется arith-error, как обычно.

Функция: % делимое делитель

Эта функция возвращает целочисленный остаток от деления делимого на делитель. Аргументы должны быть целыми числами или маркерами.

Для любых двух целых чисел делимого и делителя,

(+ (% делимое делитель)
   (* (/ делимое делитель) делитель))

всегда равно делимому, если делитель не равен нулю.

(% 9 4)
     ⇒ 1
(% -9 4)
     ⇒ -1
(% 9 -4)
     ⇒ 1
(% -9 -4)
     ⇒ -1
Функция: mod делимое делитель

Эта функция возвращает значение делимого по модулю делителя; другими словами, остаток от деления делимого на делитель, но с тем же знаком, что и делитель. Аргументы должны быть числами или маркерами.

В отличие от %, mod допускает аргументы с плавающей запятой; он округляет частное вниз (в сторону минус бесконечности) до целого и использует это частное для вычисления остатка.

Если делитель равен нулю, mod сигнализирует об ошибке arith-error, если оба аргумента целые, и возвращает NaN в противном случае.

(mod 9 4)
     ⇒ 1
(mod -9 4)
     ⇒ 3
(mod 9 -4)
     ⇒ -3
(mod -9 -4)
     ⇒ -1
(mod 5.5 2.5)
     ⇒ .5

Для любых двух чисел делимого и делителя,

(+ (mod делимое делитель)
   (* (floor делимое делитель) делитель))

всегда равно делимому, с учетом ошибки округления, если хотя бы один аргумент является числом с плавающей запятой, и с ошибкой arith-error, если делимое является целым числом, а делитель равен 0. О floor см. Преобразования чисел.