gpt4 book ai didi

list - 通过复制重复列表元素

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

我需要将列表的每个元素重复 N 次,即执行这种转换:

(1 2 3) => (1 1 1 2 2 2 3 3 3) ; N = 3

保持元素的顺序很重要,即第一个元素应重复 N 次,然后是第二个,依此类推。

这是我迄今为止最好的尝试:

(defun my-fnc (lst &optional (n 2))
(mapcan (lambda (x) (make-list n :initial-element x))
lst))

看起来有效:

CL-USER> (defparameter *foo* '("foo" "bar"))
*FOO*
CL-USER> (setf *foo* (my-fnc *foo* 3))
("foo" "foo" "foo" "bar" "bar" "bar")

...但不完全是。问题是前三个元素是对同一个对象的引用。

("foo" "foo" "foo" "bar" "bar" "bar")
;{---------------} {---------------}
; the same string the same string

这不是我想要的。

所以我的问题是:如何以最惯用的方式解决问题,以便结果列表的每个元素都将引用复制的单独对象。

最佳答案

这在一般情况下是不可能做到的,因为 Common Lisp 不提供通用的复制功能。此外,

  • 一些对象是直接的(例如 fixnum )并且不能以任何有意义的方式复制
  • 一些对象是immutable复制它们是一种浪费
  • 一些对象是嵌套的,你必须决定是否要deep or shallow copy

不过,如果你已经解决了问题并提供了复制功能,那就不难了:

(defun my-fnc (list &key (repeat 2) copy-function)
(mapcan (if copy-function
(lambda (x)
(loop :repeat repeat :collect (funcall copy-function x)))
(lambda (x) (make-list n :initial-element x)))
list))

注意 所有 list 参数的元素被复制,即返回值没有 intersection带有参数(在 eq 测试下并假设 copy-function 返回一个 fresh 对象)

关于list - 通过复制重复列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24911599/

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