Возвращаемое значение зондирующего датчика

Я хотел бы, чтобы эта функция возвращала именно то, что передано (передано в качестве аргументов):

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

Таким образом, и то, что вы регистрируете, и то, что возвращает функция, будет одинаковым - список чисел.

Другие вопросы по тегам