我們有一個簡單的函數定義:誤差定義功能時,如果
(defn calculate [d x y]
((if (and (== d 1) (== x 1) (== y 0))
1
0)))
(println (calculate 1 1 0))
但導致這個錯誤:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at jline.ConsoleRunner.main(ConsoleRunner.java:69)
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
at user$calculate.invoke(main.clj:13)
at user$eval5.invoke(main.clj:17)
at clojure.lang.Compiler.eval(Compiler.java:6465)
at clojure.lang.Compiler.load(Compiler.java:6902)
at clojure.lang.Compiler.loadFile(Compiler.java:6863)
at clojure.main$load_script.invoke(main.clj:282)
at clojure.main$script_opt.invoke(main.clj:342)
at clojure.main$main.doInvoke(main.clj:426)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:401)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:518)
at clojure.main.main(main.java:37)
... 5 more
(順便說一句,13號線與if
和and
行)。
同樣與向量:
(defn calculate [vectorr]
((if (and (== (vectorr 0) 1) (== (vectorr 1) 1) (== (vectorr 2) 0))
1
0)))
(println (calculate [1 1 0]))
這導致:
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
...相同。
並配有地圖:
(defn calculate [mapp]
((if (and (== (mapp :d) 1) (== (mapp :x) 1) (== (mapp :y) 0))
1
0)))
(println (calculate {:d 1 :x 1 :y 0}))
結果在同一消息:
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
我們認爲是有事情做與if
,或比較。我們用普通的參數,一個向量作爲參數和一個地圖來嘗試它,顯然,錯誤保持不變。
我們還嘗試了許多其他變體,而沒有更深入地瞭解實際問題。
一般來說,如果您看到多個左側相鄰的人,您可能做錯了什麼。 –
@Alex - 非常棒的小費!在你真正想要這樣的情況下(即應用一個返回的高階函數),那麼它仍然有用做一個雙重拍攝...... – mikera
請注意'if'和'和'**不是**函數。 –