4
;; Once upon a time I opened a REPL and wrote a protocol
;; definition:
(defprotocol SomeProtocol
  (f [this]))

;; And a record:
(defrecord SomeRecord []
  SomeProtocol
  (f [this]
    "I don't do a whole lot."))

;; And a very useful side-effect free function!
(defn some-function []
  (f (SomeRecord.)))

;; I call my function...
(some-function)
;; ...to see exactly what I expect:
;; user=> "I don't do a whole lot."

;; Unsatisfied with the result, I tweak my record a little bit:
(defrecord SomeRecord []
  SomeProtocol
  (f [this]
    "I do a hell of a lot!"))

(some-function)
;; user=> "I don't do a whole lot."

对我来说似乎是一个错误。在 c++ 用户组中看到这么多错误的编译器错误报告后,我无法确定。

4

1 回答 1

6

重新定义记录后需要重新定义some-function。这样做的原因是defrecord创建一个新类型(使用 deftype)并使用(SomeRecord.)函数内部的符号将代码绑定到该类型,即使在定义了具有相同名称的新类型之后也是如此。这就是为什么通常更喜欢使用(->SomeRecord)符号来实例化记录的原因,使用这种符号将使您的代码按预期工作。

于 2013-03-23T17:09:09.620 回答