Spec-Zone.ru › Elisp

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

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API