Что такое идиоматический общий способ Lisp для увеличения/уменьшения чисел и/или числовых переменных?
Как увеличить или уменьшить число в Common Lisp?
Ответ 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