gpt4 book ai didi

clojure - 这是关闭吗?如果是这样,为什么?

转载 作者:行者123 更新时间:2023-12-04 15:37:18 25 4
gpt4 key购买 nike

在准备回答 another question 时,我为自己创建了一个。考虑以下短程序。

(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))
在 Action 监听器“timer-action”中,“counter”参数的值被更改。实际变量在 'timer-fn' 函数中声明,但在监听器中进行了更改。在我早期使用 Pascal 等语言的经验中,我会考虑通过引用传递“计数器”。这是这里的情况还是这是一个闭包的例子?还有什么?
谢谢您的帮助。

最佳答案

是的,这是一个关闭。处理程序函数定义的词法上下文被保留,当它稍后被调用时,它可以访问和更新“存在”在那里的变量。

我不知道如何回答这个问题,“为什么?”除了指出这只是语言被定义为工作的方式。

关于clojure - 这是关闭吗?如果是这样,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4805938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com