在<می‌توانید نظر خود را در< マ Clojure 2024状态调查!

欢迎!请查看关于页面了解更多关于如何使用本站的信息。

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

我可以通过对结果进行递归来实现它。

`
([结果]
(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

你好,

我在ticket上发布的最后一个测试在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

我从描述中移除核心异步部分以澄清问题。

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 改变后可以解决这个问题。

这个工单的要点是,在 cloj (既包含 core.async 和 sequence,也包含 cljs (core.async)) 和 cljs sequence 中相同(不正确)的 transducer 的行为是不同的。

0 投票
相关信息: https://clojure.atlassian.net/browse/CLJS-1222 (由 alex+import 报告)
...