Clojure 如何为redis编写模拟“lrem”行为的传感器
是一个接受n和一个值的命令,用于从列表中删除该值的前n个元素 如何使用传感器编写类似的内容: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
(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传感器,然后按正确的顺序将一半组合在一起。谢谢!这就是我想要的。我想我现在明白了,虽然我在想可能有一种更优雅的方式来记忆状态,而不是用易变的声音。谢谢!这就是我想要的。我想我现在明白了,虽然我在想可能有一种更优雅的方式来记忆状态,而不是用易变的记忆。