我想更改列表的第 n 个元素并返回一个新列表。
我想到了三个相当不优雅的解决方案:
(defun set-nth1 (list n value)
(let ((list2 (copy-seq list)))
(setf (elt list2 n) value)
list2))
(defun set-nth2 (list n value)
(concatenate 'list (subseq list 0 n) (list value) (subseq list (1+ n))))
(defun set-nth3 (list n value)
(substitute value nil list
:test #'(lambda (a b) (declare (ignore a b)) t)
:start n
:count 1))
这样做的最佳方法是什么?
怎么样
(defun set-nth4 (list n val)
(loop for i from 0 for j in list collect (if (= i n) val j)))
也许我们应该注意到与substitute
并遵循其约定:
(defun substitute-nth (val n list)
(loop for i from 0 for j in list collect (if (= i n) val j)))
顺便说一句,关于set-nth3
,有一个函数,不断地 http://clhs.lisp.se/Body/f_cons_1.htm,正是针对这样的情况:
(defun set-nth3 (list n value)
(substitute value nil list :test (constantly t) :start n :count 1))
Edit:
另一种可能性:
(defun set-nth5 (list n value)
(fill (copy-seq list) value :start n :end (1+ n)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)