Арифметические операции
Emacs Lisp предоставляет четыре традиционные арифметические операции (сложение, вычитание, умножение и деление), а также функции для вычисления остатка и модуля и функции для прибавления или вычитания 1. За исключением %, каждая из этих функций принимает целочисленные аргументы и аргументы с плавающей точкой и возвращает число с плавающей точкой, если хотя бы один аргумент является числом с плавающей точкой.
- Функция: 1+ number-or-marker
-
Эта функция возвращает number-or-marker плюс 1. Например:
(setq foo 4) ⇒ 4 (1+ foo) ⇒ 5Эта функция не аналогична оператору C
++— она не увеличивает значение переменной. Она лишь вычисляет сумму. Поэтому, если продолжить:foo ⇒ 4Если вы хотите увеличить значение переменной, необходимо использовать
setq(илиincf), например:(setq foo (1+ foo)) ⇒ 5
- Функция: 1- number-or-marker
Эта функция возвращает number-or-marker минус 1.
- Макрос: incf place &optional delta
-
Этот макрос увеличивает число, хранящееся в place, на единицу или на delta, если оно указано. Он возвращает увеличенное значение.
place может быть символом или обобщённой переменной; см. Обобщённые переменные. Например, ‘(incf i)’ эквивалентно ‘(setq i (1+ i))’, а ‘(incf (car x) 2)’ эквивалентно ‘(setcar x (+ (car x) 2))’.
- Макрос: decf place &optional delta
Этот макрос уменьшает число, хранящееся в place, на единицу или на delta, если оно указано. Он возвращает уменьшенное значение.
- Функция: + &rest numbers-or-markers
-
Эта функция складывает переданные ей аргументы. Если аргументы не указаны,
+возвращает 0.(+) ⇒ 0 (+ 1) ⇒ 1 (+ 1 2 3 4) ⇒ 10
- Функция: - &optional number-or-marker &rest more-numbers-or-markers
-
Функция
-выполняет две операции: смену знака и вычитание. Если-получает один аргумент, результатом является отрицательное значение этого аргумента. Если аргументов несколько,-последовательно вычитает каждое значение more-numbers-or-markers из number-or-marker. Если аргументы не указаны, результат равен 0.(- 10 1 2 3 4) ⇒ 0 (- 10) ⇒ -10 (-) ⇒ 0
- Функция: * &rest numbers-or-markers
-
Эта функция перемножает переданные ей аргументы и возвращает произведение. Если аргументы не указаны,
*возвращает 1.(*) ⇒ 1 (* 1) ⇒ 1 (* 1 2 3 4) ⇒ 24
- Функция: / number &rest divisors
-
Если задан один или несколько делителей divisors, эта функция последовательно делит number на каждый из них и возвращает частное. Если делители divisors не заданы, функция возвращает 1/number, то есть обратное число для number относительно умножения. Каждый аргумент может быть числом или маркером.
Если все аргументы являются целыми числами, результат также является целым числом: после каждого деления частное округляется в сторону нуля.
(/ 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.
- Функция: % dividend divisor
-
Эта функция возвращает целый остаток от деления dividend на divisor. Аргументы должны быть целыми числами или маркерами.
Для любых двух целых чисел dividend и divisor
(+ (% dividend divisor) (* (/ dividend divisor) divisor))
всегда равно dividend, если divisor не равен нулю.
(% 9 4) ⇒ 1 (% -9 4) ⇒ -1 (% 9 -4) ⇒ 1 (% -9 -4) ⇒ -1
- Функция: mod dividend divisor
-
Эта функция возвращает значение dividend по модулю divisor; другими словами, остаток от деления dividend на divisor, имеющий тот же знак, что и divisor. Аргументы должны быть числами или маркерами.
В отличие от
%,modдопускает аргументы с плавающей точкой; функция округляет частное вниз (в сторону минус бесконечности) до целого числа и использует это частное для вычисления остатка.Если divisor равен нулю,
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Для любых двух чисел dividend и divisor
(+ (mod dividend divisor) (* (floor dividend divisor) divisor))
всегда равно dividend, с учётом погрешности округления, если хотя бы один аргумент является числом с плавающей точкой, и
arith-error, если dividend — целое число, а divisor равен 0. О функцииfloorсм. Преобразование чисел.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Arithmetic-Operations.html