为什么我的 clojure REPL 输出乱码?
Why does my clojure REPL output gibberish?
我正在对一些非常基本的功能进行原型设计,但 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"]
函数首先是 class Clojure 的公民。所以你定义了一个匿名函数(请注意,这里接近于空操作,因为你不坚持它——而且你在错误的地方也有一些括号(见下文))和 REPL给你打印出来了
所以这基本上就是 .toString()
JVM 所见的函数对象的表示。
旁注:
为了更好地命名您的堆栈跟踪,您还可以将 anon 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]>
编辑(函数有多个问题)
至于函数本身,内部更新也是一个空操作,因为你
也没有分配更新的结果。现在的功能总是
returns20
。
要调用该函数,您必须修复括号:
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
(函数对周围的parens排在首位,所以
将被调用。
这现在给出一个错误,因为 update
需要一个函数 - 使用 assoc
相反:
user=> ((fn [step] (assoc {:x 10 :y 10} :x step)) 20)
{:x 20, :y 10}
我正在对一些非常基本的功能进行原型设计,但 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"]
函数首先是 class Clojure 的公民。所以你定义了一个匿名函数(请注意,这里接近于空操作,因为你不坚持它——而且你在错误的地方也有一些括号(见下文))和 REPL给你打印出来了
所以这基本上就是 .toString()
JVM 所见的函数对象的表示。
旁注:
为了更好地命名您的堆栈跟踪,您还可以将 anon 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]>
编辑(函数有多个问题)
至于函数本身,内部更新也是一个空操作,因为你
也没有分配更新的结果。现在的功能总是
returns20
。
要调用该函数,您必须修复括号:
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
(函数对周围的parens排在首位,所以 将被调用。
这现在给出一个错误,因为 update
需要一个函数 - 使用 assoc
相反:
user=> ((fn [step] (assoc {:x 10 :y 10} :x step)) 20)
{:x 20, :y 10}