oznacza to, że należy utworzyć nowe zmienne zamiast zmianę wartości starych. Na przykład, weźmy następujący kod:
(defun foo (x)
(when (minusp x)
(setq x (- x)))
do something with x)
Zamiast tego, należy utworzyć nowe wiązania i używać tego jednego Zamiast:
(defun foo (x)
(let ((xabs (if (minusp x)
(- x)
x)))
do something with xabs)
Powodem tego jest to, że będziesz zawsze wiedzieć, co zmienna zawiera, ponieważ nigdy się nie zmieni. Jeśli chcesz nową wartość, po prostu użyj zmiennej, która przechowuje tę nową wartość.
Teraz możesz zapytać, dlaczego to jest tak ważne? Cóż, niektórzy ludzie mają silniejsze preferencje niż inni. Szczególnie osoby, które wolą podkreślać funkcjonalny aspekt Lisp będą bronić tego stylu. Jednak niezależnie od preferencji, może być bardzo użyteczne, aby zawsze móc polegać na tym, że zmienne się nie zmieniają. Oto przykład, gdzie może to być ważne:
(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))
Następnie wartość zwracana FOO
to funkcja, która po wywołaniu z nadrukiem wartość x
. Ale wartość będzie równa x
później w funkcji, wartość bezwzględna. Może to być bardzo zaskakujące, jeśli funkcja jest duża i skomplikowana.
Ponowne wiązanie, najprawdopodobniej tak jak przy maskowaniu poprzedniej nazwy na nową, np. '(Let ((a 1)) (let ((a 2)) ...))' –
To jest głupia wskazówka . Idź głową i zmodyfikuj lokalne zmienne, tak jak chcesz. Zwróć uwagę, że 'loop' modyfikuje zmienne lokalne. W '(pętla dla i poniżej 10 ...)' ponowne wiązanie 'i' nie ma miejsca; pojedyncza instancja 'i' jest krokowa, więc" unikaj modyfikacji lokalnych zmiennych "jest równoznaczne z" unikaniem 'pętli". A zatem, przez zasadę wnioskowania "reductio ad religio", udowodniliśmy, że ta wskazówka jest niewłaściwa. – Kaz
Jak zapewne wiesz, standard Common Lisp nie określa, czy 'LOOP' wiąże nową zmienną, czy też zmienia istniejącą. Rozumiem to raczej jako ogólną wytyczną, a nie jako surową regułę, której nie wolno łamać. –