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

即便如此,它也奇怪的是先前的版本在 ClojureScript 和 Clojure 的核心异步处理以及序列中表现不同。

0

评论由:dnolen 提出

请在不使用核心异步的基础上展示这个问题。谢谢。

0

评论由:lucascs 提出

您好,

我最后在工单中发布的测试,在 ClojureScript 中失败,但在 Clojure 中不失败。

`
;;此测试失败! =(
(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(both core.async 和 sequence)和 cljs(core.async)中的行为与 cljs sequence 不同。

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