Jaki jest standard Common Lisp do zwiększania/zmniejszania liczb i/lub zmiennych liczbowych?Jak inkrementować lub zmniejszać liczbę w Common Lisp?
Odpowiedz
Użyj wbudowanych funkcji "+" lub "-" lub ich skrót "1+" lub "1-", jeśli chcesz tylko użyć wyniku, bez modyfikowania oryginalnego numeru (argumentu). Jeśli chcesz zmodyfikować oryginalne miejsce (zawierające numer), użyj wbudowanych funkcji "incf" lub "decf".
Korzystanie operatorowi dodatkowo:
(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
Lub, jeśli wolisz, możesz kliknąć na poniższy krótki ręki:
(1+ num) ; returns 42, does not modify num.
(1- num) ; returns 40, does not modify num.
pamiętać, że wspólna specyfikacja Lisp określa powyższe dwie formy do być równoważne pod względem znaczenia i sugeruje, że implementacje sprawiają, że są one równoważne pod względem wydajności. Chociaż jest to sugestia, zdaniem ekspertów Lisp każda "szanująca się" implementacja nie powinna wykazywać różnicy w wydajności.
Jeśli chcesz zaktualizować num (nie tylko dostać 1 + jego wartość), a następnie użyć "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
UWAGA:
Można również użyć incf/decf do przyrostu (ubytek) o więcej niż 1 jednostkę:
(setf foo 40)
(incf foo 2.5) ; returns 42.5, and foo is now 42.5
Aby uzyskać więcej informacji, zobacz Common Lisp Hyperspec: 1+ incf/decf