gpt4 book ai didi

lisp - 在 Common Lisp 中转置列表

转载 作者:太空宇宙 更新时间:2023-11-03 18:33:44 25 4
gpt4 key购买 nike

我正在尝试转置列表列表;我的评论表明了思考过程。

(setq thingie  '((1 2 3) (4 5 6) (7 8 9)))  ;;test case

(defun trans (mat)
(if (car mat)
(let ((top (mapcar 'car mat)) ;;slice the first row off as a list
(bottom (mapcar 'cdr mat))) ;;take the rest of the rows
(cons top (trans bottom)))) ;;cons the first-row-list with the next-row-list
mat)

(trans thingie)
=> ((1 2 3) (4 5 6) (7 8 9)) ;;wait what?

但是,我真的很想这样

((1 4 7) (2 5 8) (3 6 9))

我做错了什么?

最佳答案

有一个简单的方法:

(defun rotate (list-of-lists)
(apply #'mapcar #'list list-of-lists))

您的尝试总是返回原始的mat。修复缩进,您会发现 if 表单的返回值总是被丢弃。

编辑:这是如何工作的:

  • List 可以接受任意数量的参数并生成一个列表。它的函数定义可以想象成这样:

    (defun list (&rest arguments)
    arguments) ; exploit the automatic &rest construction
  • Mapcar 接受一个函数和任意数量的列表,然后生成一个通过始终调用函数创建的值的新列表这些列表中的一个元素。示例:(mapcar #'foo'((A B) (C
    D)))
    将构造一个新列表,其中第一个元素是(foo 'A 'C) 的结果,第二个是 (foo 'B 'D) 的结果。

  • Apply 将可展开的参数列表指示符作为其最后一个争论。这意味着如果你给它一个列表作为它的最后一个参数,该列表可以“传播”以产生单独的参数为功能。示例:(apply #'+ '(1 2 3)) 具有相同的效果为 (+ 1 2 3)

现在你可以展开这条线:

(apply #'mapcar #'list '((A B) (C D)))

=>

(mapcar #'list '(A B) '(C D))

=>

(list (list 'A 'C) (list 'B 'D))

=>

'((A C) (B D))

关于lisp - 在 Common Lisp 中转置列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3513128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com