将向量连接到普通关键字或关键字向量的惯用方法

Idiomatic way to join a vector to either a plain keyword or a vector of keywords

寻找最简单或最惯用的方式来处理可能是简单关键字或关键字向量的输入。也许是一个将普通关键字转换为列表的函数。尽量避免 if 子句,并尽量避免过多的函数链接。

 (defn togethr [v1]
   (into [] (flatten (into [:a] (vector v1))))

 (togethr :b) 
 ; => [:a :b]

 (togethr [:b :c])
 ; => [:a :b :c]

这里我链接了 4 个函数调用,我怀疑有更简单(更惯用)的方法。

在这种情况下使用 if 并不罕见。它将它归结为一个函数调用和一个 if 表达式:

user> (defn togethr [thing]
        (into [:a] (if (sequential? thing) thing [thing])))
#'user/togethr
user> (togethr 1)
[:a 1]
user> (togethr :b)
[:a :b]
user> (togethr [:b :c])
[:a :b :c]

Arthur 的回答很好,但回到更广泛的上下文,拥有一个可能是关键字的参数,或者一组关键字通常是一种反模式。最好更改调用代码以一致地传递关键字向量。 Stuart Sierra 甚至为此创造了一个术语:‘heisenparameter’.