可以更好地避免零连接吗?

tim*_*mbo 4 clojure clojure-core

我有一个令牌扫描器,它只是返回nil我不感兴趣的字符。conj我不想将它们添加到我的令牌向量中,然后将它们全部删除,而是简单地不添加它们。

我在用着

;; dont conjoin if value false
(defn condj [v val]
  (cond-> v, val (conj val)))
Run Code Online (Sandbox Code Playgroud)

去做这个。是否有特定的运算符或更简洁的实现?

Rul*_*lle 5

我相信您可以为此使用传感器。此处对其进行了解释。我们的约简函数是conj,我们构建了一个转换器(remove nil?),将该函数转换为将忽略的函数nil

(def condj ((remove nil?) conj))
Run Code Online (Sandbox Code Playgroud)

请注意, 与remove是相反的filter。我们还可以condj使用(filter some?), some?来实现 是一个对任何值都成立的函数,除了nil

(def condj ((filter some?) conj))
Run Code Online (Sandbox Code Playgroud)

这似乎有效:

user=> (condj [3 4 5] 9)
[3 4 5 9]
user=> (condj [3 4 5] nil)
[3 4 5]
user=> (condj [3 4 5] false)
[3 4 5 false]
Run Code Online (Sandbox Code Playgroud)

  • 很好,转换器可以进一步简化为“(过滤一些?)”或“(删除零?)”。 (2认同)