我希望这个函数能够准确地返回它传递的内容(作为参数传入):
(defn log [& txts]
(.log js/console (apply str txts))
txts)
当返回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]
答案 0 :(得分:0)
将功能定义为
时(defn log [& txts]
...
txts)
这意味着您可以传递任意数量的参数,然后在列表txts中收集这些参数。因此,您的案例中的返回值是一个列表。
所以当你打电话
(random-colour-logged)
txts的值将是单个向量的列表:
'([255 255 0])
这在您的示例中发生(在您的函数内部):
user=> (println (apply str '([255 255 0])))
[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)))))
这两种方式 - 你记录的内容和函数返回的内容都是相同的 - 数字列表。