请在 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 提出

我可以通过递归结果来解决这个问题。

`
([结果]
(loop [res 结果]

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

评论由:dnolen 提出

为了阐明问题,我已经从描述中删除了core.async相关的部分。

0
by

评论由:dnolen 提出

上面{{sliding-window}}的实现似乎不正确,它没有返回结果。这个工单需要更多信息。

0
by

评论由: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)和cljs(core.async)中同一个(错误的)transducer的行为与cljs sequence不同。

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