Возвращаемое значение зондирующего датчика
Я хотел бы, чтобы эта функция возвращала именно то, что передано (передано в качестве аргументов):
(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 ответ
Когда вы определяете свою функцию как
(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)))))
Таким образом, и то, что вы регистрируете, и то, что возвращает функция, будет одинаковым - список чисел.