Clojure 2024状态调查中分享您的想法!

欢迎!请查看关于页面以获取更多关于该工作方式的详细信息。

0
ClojureScript

我正在转换器的1个参数上生成多个元素,而序列只考虑最后一个。

以下是转换器和失败的序列测试

`
(defn sliding-window [n]
(fn [rf]

(let [a #js []]
  (fn
    ([] (rf))
    ([result]
     (loop [] ;; Here I'm emitting more than one element
       (when (not-empty a)
         (rf result (vec (js->clj a)))
         (.shift a)
         (recur))))
    ([result input]
     (.push a input)
     (if (== n (.-length a))
       (let [v (vec (js->clj a))]
         (.shift a)
         (rf result v))
       result))))))

;;这个测试失败了! = (
(deftest sliding-window-in-a-sequence
(is (= [[5 4 3]

      [4 3 2]
      [3 2 1]
      [2 1]
      [1]]
     (sequence (sliding-window 3) [5 4 3 2 1])))

(is (= [[2 1]

      [1]]
     (sequence (sliding-window 3) [2 1]))))

`

7 个答案

0

评论由:lucascs

我可以通过递归结果来使其工作。

`
([result]
(loop [res result]

(if (not-empty a)
  (let [v (vec (js->clj a))]
    (.shift a)
    (recur (rf res v)))
  res)))```

即使如此,它在 core.async、cljs 中的序列和 clj 中的核心异步版本上表现得不同还是有点奇怪

0

评论由:dnolen

请在不使用 core.async 的情况下演示此问题。谢谢。

0

评论由:lucascs

你好,

我在任务单上发布的最后一个测试在 cljs 中失败,但在 clj 中没有

`
;;这个测试失败了! = (
(deftest sliding-window-in-a-sequence
(is (= [[5 4 3]

      [4 3 2]
      [3 2 1]
      [2 1]
      [1]]
     (sequence (sliding-window 3) [5 4 3 2 1])))

(is (= [[2 1]

      [1]]
     (sequence (sliding-window 3) [2 1]))))

`

0

评论由:dnolen

我已经从描述中去除了 core.async 的部分,以澄清问题。

0

评论由:dnolen

上面的 {{sliding-window}} 的实现看起来是错误的,它没有返回结果。这个工单需要更多信息。

0

评论由:lucascs

正如我在http://dev.clojure.org/jira/browse/CLJS-1222?focusedCommentId=38620&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-38620上所说

将 {{sliding-window}} 的 1 参数改为那样可以修复 transducer。

此工单的要点是,clj(core.async 和 sequence)中相同(错误)的 transducer 的行为与 cljs sequence 不同。

0
参考: https://clojure.atlassian.net/browse/CLJS-1222(由 alex+import 报告)
...