Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:我如何将代理方法代码从长代理语句中提取出来?_Clojure_Proxy_Refactoring - Fatal编程技术网

Clojure:我如何将代理方法代码从长代理语句中提取出来?

Clojure:我如何将代理方法代码从长代理语句中提取出来?,clojure,proxy,refactoring,Clojure,Proxy,Refactoring,我有一个Clojureproxy语句变得越来越大和混乱,因此我决定尝试将beginDrag方法重新定义的代码从proxy语句中分解出来,如下所示: (defn enhanced-start-drag "" [pie] (let [pobj (. pie getPickedNode) pobj-coll (seq (.. pie getInputManager getKeyboardFocus getSelection))] (prin

我有一个Clojure
proxy
语句变得越来越大和混乱,因此我决定尝试将
beginDrag
方法重新定义的代码从
proxy
语句中分解出来,如下所示:

(defn enhanced-start-drag
  ""
  [pie]
  (let [pobj   (. pie getPickedNode)
    pobj-coll (seq (.. pie getInputManager
               getKeyboardFocus getSelection))]
    (println pobj)
    (println pobj-coll)
    (println "----------")
    (proxy-super startDrag pie)))  ; THIS IS LINE 94 (SEE ERROR MSG)



(defn custom-selection-event-handler [marqueeParent selectableParent]
  (proxy [PSelectionEventHandler]  [marqueeParent selectableParent]
    (decorateSelectedNode [node]
              (let [stroke-color (Color/red)]
                (.setStrokePaint node stroke-color)))
    (undecorateSelectedNode [node]
                (let [stroke-color (Color/black)]
                  (.setStrokePaint node stroke-color)))
    (startDrag [pie]    ; pie is a PInputEvent
           (enhanced-start-drag pie))
    (endStandardSelection [pie]     ; pie is a PInputEvent
              (let [pobj   (.getPickedNode pie)
                slip   (. pobj getAttribute "slip")
                ]
                (swap! *last-slip-clicked*
                   (fn [x] slip))))))
我得到以下编译错误:

cd /Users/gw/tech/clojurestuff/cljprojects/infwb/src/infwb/
1 compiler notes:

Unknown location:
  error: java.lang.Exception: Unable to resolve symbol: this in this context

core.clj:94:5:
  error: java.lang.Exception: Unable to resolve symbol: this in this context 
    (core.clj:94)

Compilation failed.
只要我将
enhanced start的主体拖放到
proxy
语句主体中,一切都会正常工作

我的问题:是否有办法将混乱的细节转移到单独的函数中,以提高代码的可读性

感谢您的所有想法和解决方案


更新,2011年10月27日:见下面的评论。Arthur Ulfeldt尖锐地指出问题在于捕获的引用,Dave Ray也正确地指出,您所要做的就是将
作为参数添加到
增强的开始拖动
,然后
代理超级
将正常工作。当我进行以下两项更改时(没有对增强的开始拖动的主体进行任何更改),我的代码再次工作:

  (defn enhanced-start-drag
    ""
    [pie this]

顺便说一句,我的项目使用Dave Ray的
seesaw
项目来获得Java Swing UI
seesaw
非常棒,它的文档字符串和示例代码(比大多数商业软件好得多)也非常棒。我强烈推荐它!谢谢你,戴夫

你被狗咬了。在这种情况下,这是有意的,尽管你需要保持警惕。从
超级代理

Use to call a superclass method in the body of a proxy method. 
Note, expansion captures 'this`
代理正在创建一个调用函数的类,当调用进入
enhanced start drag
时,
this
的值不是proxy super期望的值

您可能需要将
作为另一个参数传递到增强的开始拖动中,然后调用
(.已保存此…
),而不是使用超级代理



传递
无效,因为调用
.startDrag
将创建一个无限循环。另一种解决方案可能是将
增强的开始拖动
放入宏中。将
作为参数包含到
增强的开始拖动
中,然后调用
代理超级
将正常工作。没有无限循环。下面是一个例子:
Use to call a superclass method in the body of a proxy method. 
Note, expansion captures 'this`