可变参数日志探测的返回值

时间:2015-08-18 06:19:52

标签: clojure clojurescript

我希望这个函数能够准确地返回它传递的内容(作为参数传入):

(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]

1 个答案:

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

这两种方式 - 你记录的内容和函数返回的内容都是相同的 - 数字列表。