0

我正在用 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 循环,只是为了防止 main 函数立即关闭。

这运行时不会引发任何错误,但不会报告剪贴板何时发生更改或在我将 bannan-man 复制到剪贴板时停止 while 循环。我已经为此苦苦挣扎了几个星期,我确定我错过了一些简单的东西。如果有人有一些建议,我将不胜感激!

4

1 回答 1

0

对于初学者来说,内容是一个代理,所以它永远不会等于一个字符串。您应该取消引用代理使用@以便进行比较。

不需要while循环来防止退出。如果您使用代理线程池,Clojure 在您明确运行之前不会关闭shutdown-agents。但我们将需要它来管理您的代理更新。

contentsend除非您使用or明确向其发送更新功能,否则在初始分配后不会更改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))
于 2015-03-30T06:53:50.903 回答