我正在对一些非常基本的功能进行原型设计,但是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"]
活动是Clojure的头等公民。因此,您定义了一个匿名函数(请注意,在这里接近无操作,因为您不坚持使用它-而且在错误的位置也有一些括号(见下文)),RE < [P L为您打印出来。
因此,这基本上是您的函数对象的.toString()
表示形式,就像JVM看到它的方式。旁注:
为了更好地为您的堆栈跟踪命名,您还可以命名匿名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}