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

欢迎!请参见关于页面以获取更多有关此功能的信息。

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-arity 改变后修复了 transducer。

这个工单的目的是指出,相同的(错误)transducer 在 clj(既是 core.async 和 sequence,也是 cljs(core.async))和 cljs sequence 的行为不同。

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