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

Vector 将向量连接到普通关键字或关键字向量的惯用方法,vector,clojure,keyword,Vector,Clojure,Keyword,寻找最简单或最惯用的方法来处理可能是简单关键字或关键字向量的输入。可能是将普通关键字转换为列表的函数。尽量避免使用if子句,也尽量避免过多的函数链接 (defn togethr [v1] (into [] (flatten (into [:a] (vector v1)))) (togethr :b) ; => [:a :b] (togethr [:b :c]) ; => [:a :b :c] 这里我链接了4个函数调用,我怀疑有一种更简单(更惯用)的方法。在这种

寻找最简单或最惯用的方法来处理可能是简单关键字或关键字向量的输入。可能是将普通关键字转换为列表的函数。尽量避免使用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)甚至为此创造了一个术语:。

Arthur的答案很好,但回到更广泛的上下文,有一个参数可能是一个关键字,或者一组关键字通常是一个反模式。最好更改调用代码以一致地传递向量关键字。斯图尔特·塞拉(Stuart Sierra)甚至为此创造了一个术语:。这就是我一直在寻找的东西,但却无法清楚地表达出来。虽然亚瑟确实回答了我的问题,我非常感谢他抽出时间回答我的问题,但我感谢你退后一步,引导我走上一条比直接向我提出要求更好的道路!