Nó có nghĩa là bạn nên tạo biến mới thay vì thay đổi giá trị của những cái cũ. Ví dụ, chúng ta hãy đoạn mã sau:
(defun foo (x)
(when (minusp x)
(setq x (- x)))
do something with x)
Thay vào đó, ta nên tạo một ràng buộc mới và sử dụng rằng một thay vì:
(defun foo (x)
(let ((xabs (if (minusp x)
(- x)
x)))
do something with xabs)
Lý do cho điều này là bạn sẽ luôn luôn biết những gì một biến chứa, vì nó sẽ không bao giờ thay đổi. Nếu bạn muốn giá trị mới, chỉ cần sử dụng biến chứa giá trị mới đó.
Bây giờ bạn có thể hỏi tại sao điều này lại quan trọng như vậy? Vâng, một số người có sở thích mạnh mẽ hơn so với những người khác. Đặc biệt những người thích nhấn mạnh khía cạnh chức năng của Lisp sẽ ủng hộ phong cách này. Tuy nhiên, bất kể sở thích, nó có thể rất hữu ích để luôn luôn có thể dựa vào thực tế là các biến không thay đổi. Dưới đây là một ví dụ nơi này có thể quan trọng:
(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))
Sau đó, giá trị trả về của FOO
là một chức năng mà khi được gọi với in giá trị của x
. Tuy nhiên, giá trị sẽ là x
sau đó trong hàm, giá trị tuyệt đối. Điều này có thể rất đáng ngạc nhiên nếu hàm này lớn và phức tạp.
Nguồn
2013-06-18 11:18:44
Rebinding, rất có thể, như trong mặt nạ tên trước đó với cái mới, ví dụ, '(let ((1)) (let ((a 2)) ...))' –
Đây là một hướng dẫn câm . Đi đầu và sửa đổi tất cả các biến cục bộ mà bạn muốn. Lưu ý rằng 'loop' sửa đổi các biến cục bộ. Trong '(vòng lặp cho i dưới 10 ...)', việc trả lại 'i' không xảy ra; một trường hợp duy nhất của 'i' được bước, do đó," tránh sửa đổi các biến cục bộ "là tương đương với" tránh 'vòng lặp'". Và do đó, theo quy tắc suy luận "reductio ad religio", chúng tôi chứng minh hướng dẫn này sai. – Kaz
Như bạn có thể đã biết, tiêu chuẩn Common Lisp không xác định có hay không 'LOOP' ràng buộc một biến mới hoặc thay đổi biến hiện tại. Và tôi hiểu điều này như một hướng dẫn chung, chứ không phải là một quy tắc nghiêm ngặt mà không bị phá vỡ. –