Подтвердить что ты не робот

Как увеличить или уменьшить число в Common Lisp?

Что такое идиоматический общий способ Lisp для увеличения/уменьшения чисел и/или числовых переменных?

4b9b3361

Ответ 1

Используйте встроенные функции "+" или "-" или их сокращенную "1+" или "1-", если вы просто хотите использовать результат, не изменяя исходный номер (аргумент). Если вы хотите изменить исходное место (содержащее номер), используйте встроенные функции "incf" или "decf".

Используя оператор сложения:

(setf num 41)
(+ 1 num)   ; returns 42, does not modify num
(+ num 1)   ; returns 42, does not modify num
(- num 1)   ; returns 40, does not modify num
(- 1 num)   ; NOTE: returns -40, since a - b is not the same as  b - a

Или, если хотите, вы можете использовать следующую короткую руку:

(1+ num)    ; returns 42, does not modify num.
(1- num)    ; returns 40, does not modify num. 

Обратите внимание, что спецификация Common Lisp определяет указанные выше две формы как эквивалентные по смыслу и предполагает, что реализации делают их эквивалентными по производительности. Хотя это предложение, по мнению экспертов Lisp, любая "уважающая себя" реализация не должна видеть разницы в производительности.

Если вы хотите обновить num (не просто получить 1 + его значение), используйте "incf":

(setf num 41)
(incf num)  ; returns 42, and num is now 42.

(setf num 41)
(decf num)  ; returns 40, and num is now 40.

(incf 41)   ; FAIL! Can't modify a literal

Примечание:

Вы также можете использовать incf/decf для увеличения (уменьшения) более чем на 1 единиц:

(setf foo 40)
(incf foo 2.5)  ; returns 42.5, and foo is now 42.5

Для получения дополнительной информации см. Общий Lisp Hyperspec: 1+ incf/decf