Как мне увеличить или уменьшить число в Common Lisp? - PullRequest
26 голосов
/ 17 сентября 2010

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

1 Ответ

36 голосов
/ 17 сентября 2010

Используйте встроенные функции «+» или «-» или их сокращение «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

...