将列表和元素合并为向量的优雅方式

chr*_*ris 2 clojure

有没有更简洁和/或优雅的方式来表达 let.js 中的最后一行?

(let [a ... ; int
      b ... ; int
      xs ... ; list
      y ... ; int
      z ... ; int
      ]
  (into [a b] cat [xs [y z]]))
Run Code Online (Sandbox Code Playgroud)

结果应该是一个向量。上面的表达式对于它完成的简单任务来说看起来相当复杂。在 Python 中,这将 [a, b] + xs + [y,z]更好地捕获两个附加操作的相似性。可以捕获这种相似性的更长的变体是

(into [] cat [[a b] xs [y z]])
Run Code Online (Sandbox Code Playgroud)

我使用的尝试concat似乎很冗长,但也许更具可读性?

(vec (concat [a b] xs [y z]))
Run Code Online (Sandbox Code Playgroud)

ama*_*loy 6

into/cat 肯定是最受欢迎的方法。如果您渴望简洁,可以改用语法引用,这是构建列表的强大工具:

`[~a ~b ~@xs ~y ~z]
Run Code Online (Sandbox Code Playgroud)

它非常具有表现力并且可以工作,但肯定会更慢:它主要设计用于在编译时使用小输入。不过,开销非常小。您可以通过引用它来查看它将扩展为哪些代码:

user=> '`[~a ~b ~@xs ~y ~z]
(apply vector 
       (seq (concat (list a)
                    (list b)
                    xs
                    (list y)
                    (list z))))
Run Code Online (Sandbox Code Playgroud)

我通过删除clojure.core/前缀和添加空格来编辑输出以使其更具可读性,但从语义上讲,这是 REPL 打印的内容。