【问题标题】:In Clojure, how to cons or conj the elements of a collection but not the collection itself?在 Clojure 中,如何 cons 或 conj 集合的元素而不是集合本身?
【发布时间】:2011-10-04 18:04:09
【问题描述】:

cons 目前的行为如下:

(cons '(1 2) '(3))
;=> ((1 2) 3)

我想实现:

(magic-cons '(1 2) '(3))
;=> (1 2 3)

我找不到这方面的资源,但这似乎很简单,我觉得应该有一个内置函数。

或者我只是不知道描述这种情况的文字。无论哪种方式,请让我知道。谢谢!

编辑: 请不要用“扁平化”回答:P ie

(flatten (cons '(1 2) '(3)))

【问题讨论】:

  • 只是为了让你更好地理解conscons 代表“构造”。它构造列表,将新元素一一添加到列表的开头。您正在寻找的函数类型应该将一个列表的所有元素附加到另一个列表中,或者只是连接 2 个列表。因此,在 Common Lisp 中,它被称为 append,而在 Clojure 中,正如其他人已经在这里提到的那样 - concat

标签: clojure lisp


【解决方案1】:

你必须使用concat:

clojure.core/concat
([] [x] [x y] [x y & zs])
  Returns a lazy seq representing the concatenation of the elements in the supplied colls.

使用示例:

user> (concat '(1 2) '(3))
(1 2 3)

【讨论】:

    【解决方案2】:

    我相信您正在寻找 concat(想想“连接列表”):

    [Concat] 返回一个惰性序列,表示提供的 colls 中元素的串联。

    在这种情况下,用法是:

    (concat '(1 2) '(3))    
    

    请注意,与(许多)其他 LISP 方言不同,Clojure 的 concat 产生一个惰性序列。请参阅How to covert a lazy sequence to a non-lazy in Clojure? 了解如何“强制”序列(这可能有用/不需要,取决于更大的上下文,但请记住这一点)。

    编码愉快。

    【讨论】:

      【解决方案3】:

      另一种选择是“进入”。

      into 总是返回第一个参数的类型,不像 concat 总是返回一个列表。

      => (into [2 4] '(1 2 3))
      [2 4 1 2 3]
      
      (into '(2 4) '(1 2 3))
      (3 2 1 2 4)
      

      【讨论】:

      • 警告:into 可能会更改项目的顺序,如上面的第二次调用。
      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2016-05-27
      相关资源
      最近更新 更多