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

通过在结果上递归可以使其工作。

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

(if (not-empty a)
  (let [v (vec (js->clj a))]
    (.shift a)
    (recur (rf res v)))
  res)))```

甚至是这样,前一个版本在 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 改变后可以修复转换器。

这个工单现在的重点是相同的(错误)转换器在 clj(both core.async 和 sequence)和 cljs(core.async)的行为与 cljs sequence 不同。

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