gpt4 book ai didi

common-lisp - 如何替换这个循环(循环列表)

转载 作者:行者123 更新时间:2023-12-01 12:16:30 25 4
gpt4 key购买 nike

我想用相反顺序的相同元素替换循环列表的前几个元素 (1 2 3 4 1 ...)。我已经设法用一个循环来完成它,但我想消除它并使用一个通用的 lisp 函数来处理子序列。你能帮帮我吗?

CL-USER> (setf *print-circle* t)
T
CL-USER> (defvar *cycle*
(let ((c (list 1 2 3 4)))
(setf (cdr (last c)) c)))
#1=(1 2 3 4 . #1#)
CL-USER> (let ((reversed-part (list 2 1)))
(loop for l on *cycle*
for r in reversed
do (setf (car l) r))
*cycle*)
#1=(2 1 3 4 . #1#)
;; Failed attempts:
CL-USER> (let ((reversed-part (list 2 1)))
(replace *cycle* reversed-part :end1 2 :end2 2)) ;; sets Lisp image spinning forever
CL-USER> (let ((reversed-part (list 2 1)))
(setf (subseq *cycle* 0 2) reversed-part)) ;; sets Lisp image spinning forever

最佳答案

如评论中所述,大多数作用于列表的函数都期望适当的 列表。不正确的列表(如循环列表)可能会导致无限循环或任何其他不良行为。

你最好使用显式循环。

但是,像 mapcarmaplist 等映射函数必须使用不同大小的列表(它们在最短的列表结束时结束),因此只要其中一个参数是正确的,您通常可以期望映射结束(但仍然不能保证)。同样,如果提供了 :endsubseq 可能会终止:

;; IMPORTANT
(setf *print-circle* t)

(defun nrevplace (list start end)
(mapl (lambda (u v) (setf (car u) (car v)))
(nthcdr start list)
(nreverse (subseq list start end))))

(let ((list (list 1 2 3 :a :b :c 4)))
(setf list (nconc list list))
(nrevplace list 3 6)
list)

#1=(1 2 3 :C :B :A 4 . #1#)

关于common-lisp - 如何替换这个循环(循环列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47740139/

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