Используйте встроенные функции «+» или «-» или их сокращение «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
Для получения дополнительной информации см. Hyperpec Common Lisp:
1 +
incf / decf