Clojure 如何为redis编写模拟“lrem”行为的传感器

Clojure 如何为redis编写模拟“lrem”行为的传感器,clojure,Clojure,是一个接受n和一个值的命令,用于从列表中删除该值的前n个元素 如何使用传感器编写类似的内容: (lrem [:a :b :c :b :a] 1 :b) => [:a :c :b :a] (lrem [:a :b :c :b :a] 2 :b) => [:a :c :a] 我想写些比这更简单的东西: (loop [acc 0 output [] [x & more :as arr] arr] (cond (empty? arr) out

是一个接受n和一个值的命令,用于从列表中删除该值的前n个元素

如何使用传感器编写类似的内容:

(lrem [:a :b :c :b :a] 1 :b) 
=> [:a :c :b :a]

(lrem [:a :b :c :b :a] 2 :b) 
=> [:a :c :a]
我想写些比这更简单的东西:

(loop [acc 0
       output [] 
       [x & more :as arr] arr]
  (cond (empty? arr) output
        (= count acc) (vec (concat output arr))
        (= value x) (recur (inc acc) output more)
        :else (recur acc (conj output x) more)))

这可以通过结合和等传感器的方法来实现,因为您的传感器需要同时执行这两种方法:

从序列中删除项,如筛选器 知道它被移除了多少项,这样它就可以停止了。distinct的相似之处在于它必须记住它看到的每一个值

(defn lrem [n pred]
  (fn [rf]
    (let [removed (volatile! 0)] ;; keep count of removals
      (fn
        ([] (rf))
        ([result] (rf result))
        ([result input]
         (if (and (< @removed n) (pred input))
           (do (vswap! removed inc) ;; increment removal count
               result)
           (rf result input)))))))

(into []
      (lrem 3 pos?)
      (range 10))
;=> [0 4 5 6 7 8 9]

这可以通过结合和等传感器的方法来实现,因为您的传感器需要同时执行这两种方法:

从序列中删除项,如筛选器 知道它被移除了多少项,这样它就可以停止了。distinct的相似之处在于它必须记住它看到的每一个值

(defn lrem [n pred]
  (fn [rf]
    (let [removed (volatile! 0)] ;; keep count of removals
      (fn
        ([] (rf))
        ([result] (rf result))
        ([result input]
         (if (and (< @removed n) (pred input))
           (do (vswap! removed inc) ;; increment removal count
               result)
           (rf result input)))))))

(into []
      (lrem 3 pos?)
      (range 10))
;=> [0 4 5 6 7 8 9]

标题似乎是关于编写一个新的传感器,但描述是关于组合现有传感器。你想要哪一个?我想通过一个简单的例子来学习如何使用传感器。我可以不用传感器来写这个。我想知道如何用传感器来写这个。写一个新的传感器很简单——基本上就是clojure.core/drop加上一个条件,就像泰勒·伍德的答案解决了这个问题一样。但据我所知,仅使用现有传感器是不可行的,因为它们不会以任何方式分割输入。这里你需要的是一种基本上用谓词分割输入的东西,只将drop n传感器应用于一半,然后按正确的顺序将一半组合在一起。标题似乎是要写一个新的传感器,但描述是要组合现有的传感器。你想要哪一个?我想通过一个简单的例子来学习如何使用传感器。我可以不用传感器来写这个。我想知道如何用传感器来写这个。写一个新的传感器很简单——基本上就是clojure.core/drop加上一个条件,就像泰勒·伍德的答案解决了这个问题一样。但据我所知,仅使用现有传感器是不可行的,因为它们不会以任何方式分割输入。这里你需要的是一种基本上用谓词分割输入的东西,只对一半应用drop n传感器,然后按正确的顺序将一半组合在一起。谢谢!这就是我想要的。我想我现在明白了,虽然我在想可能有一种更优雅的方式来记忆状态,而不是用易变的声音。谢谢!这就是我想要的。我想我现在明白了,虽然我在想可能有一种更优雅的方式来记忆状态,而不是用易变的记忆。