有没有更简洁和/或优雅的方式来表达 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)
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 打印的内容。