2010-09-17 51 views

Respuesta

33

Utilice las funciones incorporadas "+" o "-", o su abreviatura "1+" o "1-", si solo quiere usar el resultado, sin modificar el número original (el argumento). Si desea modificar el lugar original (que contiene un número), utilice las funciones incorporadas "incf" o "decf".

Usando el operador de suma:

(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 

O, si lo prefiere, puede utilizar el siguiente corto la mano:

(1+ num) ; returns 42, does not modify num. 
(1- num) ; returns 40, does not modify num. 

Tenga en cuenta que la especificación Common Lisp define las dos formas anteriores a ser equivalente en significado, y sugiere que las implementaciones los hacen equivalentes en el rendimiento. Si bien esta es una sugerencia, según los expertos de Lisp, cualquier implementación "que se precie" no verá ninguna diferencia en el rendimiento.

Si se quiere actualizar num (no sólo obtener 1 + su valor), a continuación, utilizar "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 

NOTA:

también puede utilizar incf/DECF de incremento (decremento) en más de 1 unidad:

(setf foo 40) 
(incf foo 2.5) ; returns 42.5, and foo is now 42.5 

Para obtener más información, consulte la Lisp hyperspec común: 1+ incf/decf