2024 Clojure 状况调查中分享你的想法!

欢迎!请参阅关于页面以了解更多有关如何工作的信息。

0
ClojureScript

我在转换器的 1-arity 上产生多个元素,而序列只考虑最后一个。

以下是有状态转换器的代码和失败的序列测试

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

即使如此,它对 cljs 和 clj 中的 core.async 和序列的行为不同也让人感到奇怪。

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
参考: https://clojure.atlassian.net/browse/CLJS-1222(由 alex+import 报告)
...