2016-09-01 38 views
1

對於Ludum Dare 36我決定嘗試一個基於文本的冒險遊戲coljure。它的工作原理,但我得到一個非致命錯誤:在線程java.swing無法投射到clojure Ifn

異常「主要」 java.lang.ClassCastException: seesaw.core.proxy $ javax.swing.JPanel中$標籤$ fd407141不能投到 clojure.lang.IFn, 編譯:(/ tmp目錄/形式init2500875452880490300.clj:1:73)

(ns ludumdare36.core 
    (:gen-class :main true) 
    (:use seesaw.core)) 

(def story [ 
      "Of all the most famous living rooms Transned's was the most famous" 
      "two" 
      "three" 
      "four" 
      "five" 
      "six" 
      "seven" 
      "eight" 
      "nine" 
      ]) 

(def mainWindow (frame :title "Hello" :content "" :on-close :exit)) 

(defn draw 
    [items & args] (
        (def mainWidget (vertical-panel :items items)) 
        (config! mainWidget :size [640 :by 480]) 
        (config! mainWindow :content mainWidget) 
        (invoke-later(-> mainWindow pack! show!)))) 

(defn writeStory [text index & args] 
    (let [makeButton (fn mb [index text] 
        (button :text text :mnemonic \N :halign :center :listen [:action (partial writeStory (get story index) (inc index))])) 
     makeStoryNode (fn ms [text index] 
         (vector text (makeButton (inc index) "Yes") (makeButton (+ index 2) "No"))) 
     ] 
    (draw (makeStoryNode text index)))) 

(defn -main 
    [& args] 
    (writeStory (get story 0) 0))            

干擾素錯誤是相當有據可查的堆棧,但我不知道哪功能是造成這個問題。也不確定我的代碼的質量。所以隨時發表評論等。我怎樣才能重構擺脫Ifn錯誤?我不明白什麼?

+2

行號不是您的代碼的一部分;請刪除它們。 –

+0

你在第30行用'(button ...)'做了什麼?沒有任何可能運行你的代碼,這是唯一的嫌疑人。如果'button'是一個小部件的包裝器,你會得到那種異常 - 它處於頭部位置。否則,附加堆棧跟蹤和原始來源,項目文件也很有用。 –

+0

我想你可能是對的我點擊時得到錯誤。所以如果我把按鈕移回去,也許增加一個Ifn檢查它會有幫助嗎? – liminal18

回答

2

從第21行開始,函數體的周圍有多餘的零件;這可能是clojure認爲你想調用由(def...) exp返回的函數的一個潛在原因。但是這會導致Swing對象無法按原樣調用。