0

いくつかのクロージュアを独学しようとして、play-clj を使用しています。これが機能する理由がわかりません:

(defn add-shape
  [x y entities]
  (write-state [x y])
  (conj entities (o-shape x y)))

これはしませんが:

(defn add-shape
  [x y entities]
  (conj entities (o-shape x y)
  (write-state [x y]))

Exception in thread "LWJGL Application" java.lang.IllegalArgumentException:No implementation of method: :draw-entity! of protocol: #'play-clj.entities/Entity found for class: java.lang.Long

これらは、2 つの関連する関数です。

(defn x-shape
  [x y] 
  (shape :line 
         :line (- x 100) (- 600 100 y) (+ x 100) (- (+ 600 100) y)
         :line (- x 100) (- (+ 600 100) y) (+ x 100) (- 600 100 y)))

(defn write-state
  [arg]
  (dosync (alter state conj arg)))
4

1 に答える 1

2

2番目に間違った場所にある括弧があることを確認してください。これを試して:

(defn add-shape
  [x y entities]
  (conj entities (o-shape x y)) ;; This is effectively a no-op, results are not used.
  (write-state [x y]))  ;; returns the results of write-state, 
                        ;; ie the result of conj-ing [x y] onto the value in ref state 

ただし、問題の根本は、2 つのバージョンの戻り値が異なることだと思います。最初の戻り値は次のとおりです。

(defn add-shape
  [x y entities]
  (write-state [x y])
  (conj entities (o-shape x y))) ;; returns the results of conj-ing the results of (o-shape x y)
                                 ;; onto the passed-in value of entities

TLDR: 関数は異なる値を返します。プログラムはおそらく最初の結果でのみ機能します。

于 2014-08-11T16:59:54.077 に答える