为什么我的Clojure REPL输出乱码?

时间:2019-12-20 11:04:02

标签: clojure read-eval-print-loop

我正在为一些真正的基本功能制作原型,但是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"]

1 个答案:

答案 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}