Ciò significa che è necessario creare nuove variabili, invece di cambiare il valore di quelli vecchi Per esempio, prendiamo il seguente codice:
(defun foo (x)
(when (minusp x)
(setq x (- x)))
do something with x)
Invece, si dovrebbe creare una nuova associazione e l'uso che uno invece:
(defun foo (x)
(let ((xabs (if (minusp x)
(- x)
x)))
do something with xabs)
La ragione di questo è che sarete sempre sapere che cosa una variabile contiene, dal momento che non cambierà mai. Se vuoi il nuovo valore, usa semplicemente la variabile che contiene quel nuovo valore.
Ora potresti chiedere perché è così importante? Bene, alcune persone hanno una preferenza più forte per questo rispetto ad altri. Soprattutto le persone che preferiscono enfatizzare l'aspetto funzionale di Lisp sosterranno questo stile. Tuttavia, indipendentemente dalle preferenze, può essere molto utile poter sempre contare sul fatto che le variabili non cambiano. Ecco un esempio in cui questo può essere importante:
(defun foo (x)
(let ((function #'(lambda() (format t "the value of x is ~a~%" x))))
(when (minusp x)
(setq x (- x)))
(other-function x)
function))
Quindi, il valore di ritorno di FOO
è una funzione che quando viene chiamato con la stampa il valore di x
. Ma il valore sarà quello di x
in seguito nella funzione, il valore assoluto. Questo può essere molto sorprendente se la funzione è grande e complicata.
fonte
2013-06-18 11:18:44
Rebinding, molto probabilmente, come nel mascherare il nome precedente con quello nuovo, ad esempio '(let ((a 1)) (let ((a 2)) ...))' –
Questa è una linea guida stupida . Vai in testa e modifica le variabili locali tutto ciò che vuoi. Si noti che 'loop' modifica le variabili locali. In '(loop for i below 10 ...)', il rebinding di 'i' non ha luogo; una singola istanza di 'i' è scalinata, quindi" evitare di modificare le variabili locali "equivale a" evitare 'loop'". E quindi, con la regola dell'inferenza "reductio ad religio", dimostriamo che questa linea guida è sbagliata. – Kaz
Come probabilmente sapete, lo standard Common Lisp non specifica se "LOOP" lega o meno una nuova variabile o cambia quella esistente. E lo capisco come una linea guida generale, piuttosto che una regola rigida che non deve essere infranta. –