2012-02-16 30 views
1

http://www.assembla.com/spaces/clojure/wiki/Datatypesdeftype在lein repl失敗我做錯了什麼?

我應該能夠鍵入以下成LEIN答覆:

(DEFTYPE酒吧[ABCDE])

(DEF B(酒吧1 2 3 4 5))

然而,當我做我得到以下輸出:

java.lang.Exception的:期待變種,但酒吧被映射到類user.Bar(NO_SOURCE_FILE:31)

我很困惑,是一個完整的福利局到Clojure的所有幫助表示讚賞!

注意:嘗試在標準clojure repl相同的代碼,並得到同樣的問題。

回答:好吧,我用一些額外的搜索來回答我自己的問題。原來樣本很差。正確的方式來實例化酒吧將是:

(DEF B(酒吧1 2 3 4 5)。)

的。在Bar的結尾使用這一點非常重要。仍然不明白爲什麼(所以你clojure專家請詳細說明,如果你有時間,因爲我想知道細節;))。

謝謝大家!

+0

的assembla網站已經過時了。此外,這是設計文件本質上是不穩定的,可能會過時很快。請查看http://clojure.org和http://clojure.github.com/clojure瞭解最新信息日期文檔。 – kotarak 2012-02-16 07:20:51

回答

3

我沒那麼熟悉deftype,但是從我看你需要一個點來實例化一個類型,試試這個:

(deftype Bar [a b c d e]) 

(def b (Bar. 1 2 3 4 5)) 

注意這不是Bar,但Bar.。見例如在這裏:

此線程似乎表明這是deftype的變化:

,或者把它周圍的其他方法,您鏈接頁面上的文檔顯得過時。

希望這會有所幫助。

2

有兩種方法可以實現你正在嘗試做的事情。首先,我們來看看deftype示例。

user=> (deftype Bar [a b c d e]) 
user.Bar 
user=> (def b (Bar. 1 2 3 4 5)) 
#'user/b 
user=> (:a b) 
nil 
user=> (.a b) 
1 

你會發現幾件事情,在這裏。如前所述,你需要「。「來實例化你的類型,而且你沒有得到關鍵字訪問(」:「符號),只有字段訪問(同樣用」。「)

另一種方法是通過定義一個記錄defrecord

user=> (defrecord Bar [a b c d e]) 
user.Bar 
user=> (def b (Bar. 1 3 5 7 9)) 
#'user/b 
user=> (:a b) 
1 
user=> (.a b) 
1 

這給了你兩個領域和關鍵詞進行訪問。這種訪問是很容易嵌套,還有,你應該決定讓你的領域之一包含另一個記錄。

+0

感謝一堆我認爲Def Record是完美的解決方案! – 2012-02-16 21:05:28