2013-04-22 27 views
10

Tôi đang sử dụng ngược chiều kim đồng hồ để chạy REPL, nhưng tôi cũng nhận thấy điều này trên Leiningen.Tại sao có thể xác định lại Var (cho rằng trong các giá trị FP là không thay đổi)?

Tôi có thể gọi def để xác định var hai lần. Ví dụ:

=> (def a 1) 
#'fractal.core/a 
=> a 
1 
=> (def a 2) 
#'fractal.core/a 
=> a 
2 

Clojure là ngôn ngữ lập trình chức năng và đối tượng FP được cho là không thay đổi. Nếu tôi có thể làm điều này theo nghĩa nào là không thay đổi?

Cảm ơn mọi nhận xét.

+1

Nói đúng ra nó không thay đổi giá trị của Var, nó được gọi là * rebinding * (nghĩ * shadowing * trong các ngôn ngữ bắt buộc). –

+0

@ om-nom-nom Điều này không có gì giống như đổ bóng. Bạn có thể gọi nó là rebinding nếu bạn thích, nhưng không có sự khác biệt cụ thể nào giữa điều này và thay đổi giá trị của var; vâng, var vẫn có cùng "giá trị" ở chỗ nó vẫn giữ cùng một ô có thể thay đổi được, nhưng nội dung của ô đó đã thay đổi và đó là điều thường có nghĩa là thay đổi giá trị của một vật. – amalloy

Trả lời

12

Toàn bộ điểm của vars là chúng có thể được phục hồi, do đó tên: var -> variable.

Từ docs:

Clojure là một ngôn ngữ thực tế công nhận sự cần thiết phải thường xuyên để duy trì một tham chiếu dai dẳng đến một giá trị thay đổi. ... Vars cung cấp một cơ chế để tham khảo một vị trí lưu trữ có thể thay đổi có thể được phục hồi động (đến một vị trí lưu trữ mới) trên cơ sở cho mỗi luồng.

Bạn không thay đổi bất kỳ giá trị bất biến nào bằng cách đặt lại var.

Hãy nghĩ đến việc chỉ đưa ra một giá trị bất biến một cái tên và sau đó đưa ra một giá trị bất biến khác có tên đó.

1

trong các đối tượng FP được cho là không thay đổi.

Điều này không đúng.

Tinh khiết lập trình hàm yêu cầu biến là giá trị bất biến. Tuy nhiên, Clojure không phải là một ngôn ngữ thuần túy, và cho phép các tác dụng phụ không được theo dõi ở bất cứ đâu.

Phần lớn các ngôn ngữ chức năng không tinh khiết, về mặt này, vì chúng không theo dõi sự xuất hiện của các tác dụng phụ, chẳng hạn như đột biến, trong chính ngôn ngữ.

+1

Nó không phải là không chính xác trong ý nghĩa rằng trong FP bạn * nên * làm cho các đối tượng bất biến và sử dụng các chức năng tinh khiết càng nhiều càng tốt. Thực tế là bạn * có thể * biến đổi trạng thái trong một ngôn ngữ FP không tinh khiết như Clojure không ngụ ý rằng đây là thực hành tốt. – mikera

+0

Tôi cho rằng điều đó phụ thuộc vào ý nghĩa của OP là "được cho là" –

3

re - def nhập một var (có nghĩa là, đặt ràng buộc gốc, trái ngược với tạm thời/thread-địa phương ràng buộc lại) chủ yếu được dự định là một công cụ để phát triển. Vì các hàm và giá trị toàn cầu chuẩn (được định nghĩa với def/defn) là dựa trên var, bạn có thể xác định lại chúng mà không phải khởi động lại chương trình clojure mà bạn đang chỉnh sửa.

Lưu ý rằng các vars là không phải là các giá trị, chúng rõ ràng có ý định là các tham chiếu có thể thay đổi thành giá trị/chức năng.

Các vấn đề liên quan