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

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


person Jabavu Adams    schedule 17.09.2010    source источник


Ответы (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 определяет две вышеупомянутые формы как эквивалентные по смыслу и предполагает, что реализации делают их эквивалентными по производительности. Хотя это предложение, по мнению экспертов Лиспа, любая «уважающая себя» реализация не должна видеть разницы в производительности.

Если вы хотите обновить число (а не просто получить 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

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

person Jabavu Adams    schedule 17.09.2010