defin在lein repl中失败了我做错了什么?

时间:2012-02-16 04:25:37

标签: clojure read-eval-print-loop deftype leiningen

http://www.assembla.com/spaces/clojure/wiki/Datatypes

我应该可以在lein回复中键入以下内容:

  

(deftype Bar [a b c d e])

     

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

然而,当我这样做时,我得到以下输出:

  

java.lang.Exception:期望var,但Bar被映射到类user.Bar(NO_SOURCE_FILE:31)

我很困惑,并且是一个完整的新手,所有的帮助都值得赞赏!

注意:在标准的clojure repl中尝试相同的代码并遇到同样的问题。

答案:嗯,我通过一些额外的搜索回答了我自己的问题。事实证明样本很糟糕。实例化Bar的正确方法是:

  

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

。在Bar结束时,这种用法很重要。仍然不太明白为什么(因此,如果你有时间,请告知专家请详细说明,因为我想知道细节;))。

谢谢大家!

2 个答案:

答案 0 :(得分:3)

我对deftype并不熟悉,但从我看到你需要一个实例化类型的点,试试这个:

(deftype Bar [a b c d e])

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

请注意,它不是Bar,而是Bar.。见例子,例如这里:

这个帖子似乎表明这是deftype

的变化

或者,换句话说,您链接到的页面上的文档似乎已过时。

希望这有帮助。

答案 1 :(得分: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

这为您提供了字段和关键字访问权限。如果您决定让其中一个字段包含另一个记录,则此访问很容易嵌套。