Песочница

Операторы

Арифметические, сравнительные и логические операторы, доступные в Lispex.

Это предыдущая редакция документации. Актуальные правила арифметики и сравнения описаны в разделе «Числовые процедуры». Другие процедуры можно найти в указателе процедур.

Эта страница кратко описывает встроенные операторы. Примечание: только #f является ложным значением; пустой список () является истинным. Результаты логики записываются как #t/#f.

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

Эти операторы выполняют стандартные математические вычисления.

+ (Сложение)

Суммирует два или более числа.

  • Без аргументов возвращает 0.
  • С одним аргументом возвращает сам аргумент.
LISPEX
(+ 10 20 5)     ;; Результат: 35
(+ 10)       ;; Результат: 10
(+)         ;; Результат: 0

- (Вычитание)

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

LISPEX
(- 100 20 10)    ;; Результат: 70
(- 10)       ;; Результат: -10

* (Умножение)

Перемножает два или более числа.

  • Без аргументов возвращает 1.
  • С одним аргументом возвращает сам аргумент.
LISPEX
(* 5 10 2)     ;; Результат: 100
(* 7)        ;; Результат: 7
(*)         ;; Результат: 1

/ (Деление)

Делит первое число на последующие. Выбрасывает ошибку при делении на ноль.

LISPEX
(/ 100 5 2)     ;; Результат: 10

modulo (остаток с округлением вниз)

Возвращает остаток от деления первого числа на второе. Знак результата совпадает со знаком делителя. Если нужен результат со знаком делимого, смотрите remainder. Требует ровно два аргумента. Псевдоним: % (не рекомендуется; предпочитайте modulo, предупреждение W330).

LISPEX
(modulo 10 3) ;; Результат: 1

quotient (Деление с усечением)

Делит первое целое на второе с усечением к нулю. Требует ровно два целых аргумента. Выбрасывает ошибку при делении на ноль.

LISPEX
(quotient 7 2) ;; Результат: 3
(quotient -7 2) ;; Результат: -3

remainder (Знак делимого)

Возвращает остаток от деления с усечением. Знак результата совпадает со знаком делимого (в отличие от modulo, где знак совпадает со знаком делителя). Выполняется тождество n = d * (quotient n d) + (remainder n d).

LISPEX
(remainder 7 3) ;; Результат: 1
(remainder -7 3) ;; Результат: -1

Операторы сравнения

Эти операторы сравнивают значения и возвращают #t или #f.

=, == (Равно)

Проверяет, равны ли два значения. Для списков выполняет глубокое рекурсивное сравнение их элементов. == является псевдонимом для =.

LISPEX
(= 10 10)      ;; Результат: #t
(= "hello" "world") ;; Результат: #f
(= (list 1 2) (list 1 2)) ;; Результат: #t

!= (Не равно)

Проверяет, не равны ли два значения. Является противоположностью =.

LISPEX
(!= 10 5)      ;; Результат: #t
(!= (list 1 2) (list 1 2)) ;; Результат: #f

> (Больше)

Проверяет, больше ли первое число, чем второе.

LISPEX
(> 10 5)      ;; Результат: #t

< (Меньше)

Проверяет, меньше ли первое число, чем второе.

LISPEX
(< 10 5)      ;; Результат: #f

>= (Больше или равно)

Проверяет, больше ли первое число или равно второму.

LISPEX
(>= 10 10)     ;; Результат: #t

<= (Меньше или равно)

Проверяет, меньше ли первое число или равно второму.

LISPEX
(<= 10 5)      ;; Результат: #f

Логические операторы

Эти операторы работают с булевой логикой и используют сокращённое вычисление.

and

Возвращает #f, как только встречает #f. Если все значения истинны (всё, что не #f), возвращает последнее значение.

LISPEX
(and #t #t)       ;; Результат: #t
(and #t #f 10)    ;; Результат: #f (останавливается на #f)

or

Возвращает первое истинное значение. Если все значения равны #f, возвращает #f.

LISPEX
(or #f 10 #t)     ;; Результат: 10 (останавливается на 10)
(or #f #f)        ;; Результат: #f

not

Возвращает противоположное логическое значение. Для #f возвращает #t, иначе #f.

LISPEX
(not #t)       ;; Результат: #f
(not #f)       ;; Результат: #t
(not 0)        ;; Результат: #f (0 истинное значение)

Сравнение символов

Сравнивает символы по их скалярному значению Unicode (кодовой точке) и образует цепочки переменной длины, как и числовые сравнения. Требуется не менее двух аргументов. Числовые операторы = < > <= >= работают только с числами, поэтому для символов нужны имена с префиксом char: char=? char<? char>? char<=? char>=?.

LISPEX
(char=? #\a #\a)        ;; Результат: #t
(char<? #\a #\b #\c)    ;; Результат: #t
(char>? #\c #\a)        ;; Результат: #t
(char<=? #\a #\a #\b)   ;; Результат: #t

Сравнение символов без учёта регистра

Имена с префиксом char-ci (char-ci=? char-ci<? char-ci>? char-ci<=? char-ci>=?) сравнивают символы без учёта регистра, складывая (fold) каждый операнд перед сравнением. Складывание точно для ASCII (так что #\a и #\A равны); несколько не-ASCII символов, чьё складывание регистра Unicode отличается от приведения к нижнему регистру, пока не складываются.

LISPEX
(char-ci=? #\a #\A)   ;; Результат: #t
(char-ci<? #\a #\B)   ;; Результат: #t

Сравнение строк

Сравнивает строки лексикографически по скалярному значению Unicode и образует цепочки переменной длины, как и сравнения символов. Требуется не менее двух аргументов. Используйте имена с префиксом string: string=? string<? string>? string<=? string>=?.

LISPEX
(string=? "a" "a")       ;; Результат: #t
(string<? "a" "b" "c")   ;; Результат: #t
(string>? "b" "a")       ;; Результат: #t
(string<=? "a" "a" "b")  ;; Результат: #t

Сравнение строк без учёта регистра

Имена с префиксом string-ci (string-ci=? string-ci<? string-ci>? string-ci<=? string-ci>=?) сравнивают строки без учёта регистра, складывая (fold) каждый операнд перед сравнением. Складывание точно для ASCII (так что "abc" и "ABC" равны); несколько не-ASCII символов, чьё складывание регистра Unicode отличается от приведения к нижнему регистру, пока не складываются.

LISPEX
(string-ci=? "abc" "ABC")   ;; Результат: #t
(string-ci<? "abc" "ABD")   ;; Результат: #t

Округление

Округляют число до целого, сохраняя точность (точное число даёт точное целое, неточное даёт неточное целое). round использует банковское округление (к ближайшему чётному), поэтому (round 5/2) равно 2, а (round 2.5) равно 2.0, а не 3. floor округляет к минус бесконечности, ceiling к плюс бесконечности, truncate к нулю.

LISPEX
(floor 7/2)      ;; Результат: 3
(ceiling 7/2)    ;; Результат: 4
(truncate -7/2)  ;; Результат: -3
(round 5/2)      ;; Результат: 2
(round 2.5)      ;; Результат: 2.0

НОД и НОК

gcd возвращает наибольший общий делитель, а lcm возвращает наименьшее общее кратное нуля или более целых чисел. Обе функции переменной арности и всегда возвращают неотрицательное целое. (gcd) равно 0, а (lcm) равно 1.

LISPEX
(gcd 12 8)    ;; Результат: 4
(gcd 12 -8)   ;; Результат: 4
(lcm 4 6)     ;; Результат: 12
(lcm 4 0)     ;; Результат: 0

Возведение в степень

expt возводит основание в целую степень. Показатель должен быть точным целым числом. Отрицательный показатель даёт точную обратную величину, а неточное основание даёт неточный результат. (Возведение в нецелую степень, требующее трансцендентной математики, не поддерживается.)

LISPEX
(expt 2 10)   ;; Результат: 1024
(expt 2 -2)   ;; Результат: 1/4
(expt 2.0 3)  ;; Результат: 8.0