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

问题描述 投票:0回答:1

我正在对一些非常基本的功能进行原型设计,但是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 read-eval-print-loop
1个回答
1
投票

活动是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}

© www.soinside.com 2019 - 2024. All rights reserved.