2011-01-26 32 views
6

Khi chuẩn bị câu trả lời cho another question, tôi đã tạo một câu trả lời cho chính mình. Hãy xem xét chương trình ngắn sau đây.Đây có phải là sự đóng cửa không? Nếu vậy, tại sao?

(ns net.dneclark.JFrameAndTimerDemo 
    (:import (javax.swing JLabel JButton JPanel JFrame Timer)) 
    (:gen-class)) 

(defn timer-action [label counter] 
(proxy [java.awt.event.ActionListener] [] 
    (actionPerformed 
    [e] 
     (.setText label (str "Counter: " (swap! counter inc)))))) 

(defn timer-fn [] 
    (let [counter (atom 0) 
     label (JLabel. "Counter: 0") 
     timer (Timer. 1000 (timer-action label counter)) 
     panel (doto (JPanel.) 
       (.add label))] 
    (.start timer) 
    (doto (JFrame. "Timer App") 
     (.setContentPane panel) 
     (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE) 
     (.setLocation 300 300) 
     (.setSize 200 200) 
     (.setVisible true)))) 

(defn -main [] 
    (timer-fn)) 

Trong trình xử lý tác vụ 'timer-action', giá trị của đối số 'counter' bị thay đổi. Biến thực sự được khai báo trong hàm 'timer-fn', nhưng bị thay đổi trong trình lắng nghe. Trong kinh nghiệm trước đó của tôi với các ngôn ngữ như Pascal, tôi đã xem 'counter' được chuyển qua tham chiếu. Đó có phải là trường hợp ở đây hay đây là một ví dụ về việc đóng cửa? Thứ gì khác?

Cảm ơn sự giúp đỡ.

Trả lời

3

Vâng, đó là sự kết thúc. Ngữ cảnh từ vựng của định nghĩa hàm xử lý được giữ nguyên, và khi nó được gọi sau đó nó có thể truy cập và cập nhật các biến "sống" ở đó.

Tôi không chắc chắn cách trả lời câu hỏi, "tại sao?" khác hơn là chỉ ra rằng nó đơn giản là cách ngôn ngữ được định nghĩa để hoạt động.

+0

Thanks Pointy. Bạn * đã làm * cho tôi biết lý do tại sao - duy trì ngữ cảnh từ vựng của trình xử lý. Thứ gì đó tôi vẫn gặp khó khăn khi quấn đầu mình lại. – clartaq

+0

Tôi nghĩ nó cũng rất khó nhưng chỉ nghĩ về nó theo cách đó. (...) sau đó ... là bối cảnh từ vựng nói rằng bạn có một cái gì đó như (i = 5 ....) sau đó tôi là 5 mỗi nơi bên trong các parens. nếu bạn định nghĩa một hàm và hàm đó đang sử dụng cái gì đó mà tôi ở bên ngoài (fn ....) bạn có một đóng vì nó nhìn bên ngoài hàm() của hàm để tìm hiểu ý nghĩa của các biến. – nickik

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