Clojure 可变记录探头的返回值

Clojure 可变记录探头的返回值,clojure,clojurescript,Clojure,Clojurescript,我希望此函数准确返回它传递的内容(已作为参数传递): 当txts被返回时,这与传入的调用方不完全相同 一旦这个问题得到回答,我将有一个日志功能,可以作为一个探测器使用-能够包装在任何现有的函数调用,而不改变程序做什么 下面是一个REPL友好的示例(复制和粘贴,以及修改为适用于Clojure的日志函数),它显示日志记录会影响输出: (def infos [{:colour [0,0,139]} {:colour [255,255,0]} {:colour [0,0,0]} {:colour [25

我希望此函数准确返回它传递的内容(已作为参数传递):

txts
被返回时,这与传入的调用方不完全相同

一旦这个问题得到回答,我将有一个日志功能,可以作为一个探测器使用-能够包装在任何现有的函数调用,而不改变程序做什么

下面是一个REPL友好的示例(复制和粘贴,以及修改为适用于Clojure的日志函数),它显示日志记录会影响输出:

(def infos [{:colour [0,0,139]} {:colour [255,255,0]} {:colour [0,0,0]} {:colour [255,0,0]}])

(defn log [& txts]
  (println (apply str txts))
  txts)

(defn random-colour-logged
  []
  (let [colour-idx (rand-int 4)]
    (log (:colour (get infos colour-idx)))))

(defn random-colour-not-logged
  []
  (let [colour-idx (rand-int 4)]
    (:colour (get infos colour-idx))))

(random-colour-logged)
(random-colour-logged)
(random-colour-not-logged)
(random-colour-not-logged)  
这是我刚刚收到的输出:

user=> (random-colour-logged)
[255 255 0]
([255 255 0])
user=> (random-colour-logged)
[0 0 139]
([0 0 139])
user=> (random-colour-not-logged)
[255 255 0]
user=> (random-colour-not-logged)
[255 0 0]

当您将函数定义为

(defn log [& txts]
  ...
  txts)
这意味着您可以传递任意数量的参数,然后将这些参数收集到一个列表txts中。因此,案例中的返回值是一个列表

所以当你打电话的时候

(random-colour-logged)
txts的值将是单个向量的列表:

'([255 255 0])
这发生在示例中(函数内部):

尝试将函数更改为

(defn log [txt]
  (.log js/console txt)
  txt)
它应该可以正常工作

编辑: 您还可以更改调用日志函数的方式:

(defn random-colour-logged
  []
  (let [colour-idx (rand-int 4)]
    (apply log (:colour (get infos colour-idx)))))

这样,您记录的内容和函数返回的内容都将是相同的数字列表。

您可以添加一个示例吗?您所说的“不完全相同”是什么意思?此函数应返回传入的参数列表。(def big word“varadic”)(log“但它将不再是”big word)请参见我的编辑。如果您不想为您的案例实现自定义日志记录,那么在这里您可以做的事情就不多了。有比在日志调用之前放入
apply
更简单的解决方法。即使如此,我还是复制/粘贴了你的
随机颜色记录的
——在REPL中,你仍然可以看到“记录”和“未记录”调用的不同结果。我要使用的实际解决方法是使用一个名为
wrap
的函数,它是
日志
的非变量版本。我将使
log
不返回任何内容。
(defn log [txt]
  (.log js/console txt)
  txt)
(defn random-colour-logged
  []
  (let [colour-idx (rand-int 4)]
    (apply log (:colour (get infos colour-idx)))))