当前位置:  开发笔记 > 开发工具 > 正文

内置Emacs Lisp库中此函数的名称?

如何解决《内置EmacsLisp库中此函数的名称?》经验,为你挑选了3个好方法。

以下Emacs Lisp函数获取列表列表并返回一个列表,其中内部列表的项目已连接到一个大列表.这很简单,我确信这样的东西必须已经成为标准函数库的一部分.

(defun flatten (LIST)
  (if LIST
      (append (car LIST) (flatten (cdr LIST)))
    nil))

我正在寻找一个函数,它将单个列表列表作为其参数,然后附加所有内部列表.

(flatten '((a b) (c d)))

会给

(a b c d)

有谁知道这个功能是否已经内置,如果有的话,在哪个名称下?

谢谢!



1> Vatine..:

你要么寻找附加物:

(defun flatten (list-of-lists)
  (apply #'append list-of-lists))

如果(并且仅当)您知道您将始终拥有列表列表.

除此以外:

(defun flatten (list)
  (mapcan (lambda (x) (if (listp x) x nil)) list))


答案是,"是的,它确实",即mapcan over identity function.

2> 小智..:

我最近才进入这个阶段,同时寻找不同的东西; 根据原始问题是否意在引用通用列表(即:列表清单列表......)或者用于检查功能的测试数据,可能没有提供证据.只是两级列表(如示例中所示).

基于append此解决方案仅适用于两级列表,并且基于mapcan此解决方案存在进一步的问题.

基本上,一般解决方案必须在car和cdr上递归,如flatten下面的defun.

(setq l '((((1 2) 3) 4) (5 6 7)))

(defun flatten(x)
  (cond ((null x) nil)
    ((listp x) (append (flatten (car x)) (flatten (cdr x))))
    (t (list x))))

(defun flatten2(l)
  (if l (append (car l) (flatten2 (cdr l))) nil))

(defun flatten3(l)
  (mapcan (lambda(x) (if (listp x) x nil)) l))

(flatten l)
(1 2 3 4 5 6 7)

(apply #'append l)
(((1 2) 3) 4 5 6 7)

(flatten2 l)
(((1 2) 3) 4 5 6 7)

进一步的问题是使用mapcanin flatten3:作为mapcan隐藏nconc内部,用户必须记住它改变其参数.

l
((((1 2) 3) 4) (5 6 7))

(flatten3 l)
(((1 2) 3) 4 5 6 7)

l
((((1 2) 3) 4 5 6 7) (5 6 7))



3> Brian Burns..:

Dash是Emacs的现代列表库,并且已变平。这是继magit之后在Melpa 上下载次数第二多的软件包。从自述文件:

-flatten (l):获取嵌套列表l,并将其内容作为单个平面列表返回。

(-flatten '((1))) ;; => '(1)
(-flatten '((1 (2 3) (((4 (5))))))) ;; => '(1 2 3 4 5)
(-flatten '(1 2 (3 . 4))) ;; => '(1 2 (3 . 4))

-flatten-n (num list):展平num嵌套列表的级别。

(-flatten-n 1 '((1 2) ((3 4) ((5 6))))) ;; => '(1 2 (3 4) ((5 6)))
(-flatten-n 2 '((1 2) ((3 4) ((5 6))))) ;; => '(1 2 3 4 (5 6))
(-flatten-n 3 '((1 2) ((3 4) ((5 6))))) ;; => '(1 2 3 4 5 6)

该软件包始于2012-09年。

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有