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

欢迎!请查阅 关于 页面以获取更多有关此方法的信息。

0
ClojureScript

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

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

`
(defn 滑动窗口 [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 滑动窗口序列测试
(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 结果]

(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 滑动窗口序列测试
(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-arity 修复了 transducer。

此问题票当中的作用是 clj(既 core.async 和 sequence)和 cljs(core.async)中相同(错误)的 transducer 的行为与 cljs sequence 不同。

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