我在clojure中编写了一个小工具,想知道剪贴板何时发生了变化。这是“正在发生的事情的简化版本”。
(:import java.awt.Toolkit)
(:import (java.awt.datatransfer Clipboard
ClipboardOwner
Transferable
StringSelection
DataFlavor
FlavorListener))
(defn get-clipboard [] (. (Toolkit/getDefaultToolkit)
(getSystemClipboard)))
(defn get-content []
(.getContents (get-clipboard) nil))
(def content (agent (get-content)))
(defn watch [key f]
(add-watch content key f))
(defn -main []
(while (not= content "banana-man")
(watch :watcher
(fn [key agent old-state new-state]
(prn "-- agent Changed --")
(prn "key" key)
(prn "atom" agent)
(prn "old-state" old-state)
(prn "new-state" new-state)))))
我已在while循环中添加,以防止主要功能立即关闭。
这样运行时不会抛出任何错误,但是当我将bannan-man复制到剪贴板时,不报告何时在剪贴板上进行了更改或停止while循环。几个星期以来,我一直在努力解决这个问题,我确信我错过了一些简单的事情。如果有人有一些建议我会非常感激!
答案 0 :(得分:0)
对于初学者来说,内容是一个代理,所以它永远不会等于一个字符串。您应该使用@
对代理进行deref以进行比较。
不需要while循环来阻止退出。如果使用代理线程池,则在显式运行shutdown-agents
之前,Clojure不会关闭。但我们需要它来管理您的代理更新。
content
或send
发送更新功能,否则 send-off
在初始分配后不会更改。不要让名称误导你,代理人不是自主的,也不是预定或重复的任务。尝试这样的事情:
(defn -main []
(watch :watcher
(fn [key agent old-state new-state]
(prn "-- agent Changed --")
(prn "key" key)
(prn "atom" agent)
(prn "old-state" old-state)
(prn "new-state" new-state)))
(while (not= @content "banana-man")
(send-off content (fn [& _] (get-content)))
(Thread/sleep 250))
(shutdown-agents))