我正在为一些真正的基本功能制作原型,但是REPL输出的是完全随机的东西。
只需尝试编写一个函数来更新映射中的值,就会得出以下结论:
fwd.core=> (fn [step] (update {:x 10 :y 10} :x 20) 20)
#object[fwd.core$eval1593$fn__1594 0x3d2da438 "fwd.core$eval1593$fn__1594@3d2da438"]
答案 0 :(得分:2)
活动是Clojure的头等公民。因此,您定义了一个匿名函数(请注意,在这里接近无操作,因为您不坚持使用它-而且在错误的位置也有一些括号(见下文)),RE < strong> P L为您打印出来。
因此,这基本上是JVM看到的函数对象的.toString()
表示形式。
旁注:
要更好地为您的堆栈跟踪命名,您还可以命名匿名fns:
user=> (fn [step] (update {:x 10 :y 10} :x 20) 20)
#<Fn@559d19c user/eval8096[fn]>
user=> (fn my-fancy-name [step] (update {:x 10 :y 10} :x 20) 20)
#<Fn@451816fd user/eval8105[my_fancy_name]>
对于函数本身,内部更新也是不可操作的,因为您
也不分配更新结果。该功能现在总是
返回20
。
要调用该函数,必须修复括号:
user=> ((fn [step] (update {:x 10 :y 10} :x step)) 20)
Execution error (ClassCastException) at user/eval8105$fn (REPL:1).
java.lang.Long cannot be cast to clojure.lang.IFn
(该功能位于周围括号的首位,因此它 将被呼叫。
这现在产生错误,因为update
需要一个函数-使用assoc
代替:
user=> ((fn [step] (assoc {:x 10 :y 10} :x step)) 20)
{:x 20, :y 10}