gpt4 book ai didi

common-lisp - 在 Lisp 中一次处理列表中的 n 个项目

转载 作者:行者123 更新时间:2023-12-04 17:22:59 25 4
gpt4 key购买 nike

给定一个列表,我如何一次处理 N 个项目? ruby 有 each_slice Enumerable 上的方法这样做; Lisp 的等价物是什么?

最佳答案

Common Lisp 的 loop 可以很好地用于此,如以下两个示例所示。 (x y z) 的第一个示例循环在一个列表中。但是,默认步骤是 cdr ( rest ),所以如果列表是 (1 2 3 4 5) , 你得到 (1 2 3) , (2 3 4)等,对于 (x y z) .

CL-USER> (loop for (x y z) on '(1 2 3 4 5 6 7 8 9 10 11 12)
do (print (list z y x)))

(3 2 1)
(4 3 2)
(5 4 3)
(6 5 4)
(7 6 5)
(8 7 6)
(9 8 7)
(10 9 8)
(11 10 9)
(12 11 10)
(NIL 12 11)
(NIL NIL 12)
NIL

如果您不希望迭代之间的重叠,请将步进函数指定为在列表中向下移动的更远的东西。例如,如果您一次拉三个元素,请使用 cdddr :
CL-USER> (loop for (x y z) on '(1 2 3 4 5 6 7 8 9 10 11 12) by 'cdddr
do (print (list z y x)))
(3 2 1)
(6 5 4)
(9 8 7)
(12 11 10)
NIL

用这种技术实现分区

另一个答案实现了 each_slice 的对应项使用辅助功能。但是,请注意 partition (在这个意义上)只是 each_slice与身份功能。这表明我们应该能够使用上面的习语来实现它。匿名函数
(lambda (list)
(nthcdr n list))

是我们需要的阶跃函数。由于直到运行时我们才知道单元格有多少元素,所以我们不能像上面使用 (x y z) 那样绑定(bind)每个元素。 .当我们下台并提取子序列 n 个元素时,我们确实必须匹配列表的每个尾部。这是 loop基于 partition 的实现.
CL-USER> (defun partition (list cell-size)
(loop for cell on list by #'(lambda (list)
(nthcdr cell-size list))
collecting (subseq cell 0 cell-size)))
PARTITION

CL-USER> (partition '(1 2 3 4 5 6) 2)
((1 2) (3 4) (5 6))

关于common-lisp - 在 Lisp 中一次处理列表中的 n 个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17198677/

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