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 に答える