我想创建一个名为(splice L i n A)
的过程,其中L
是一个列表,i
是索引,n
是元素的数量,A
是另一个清单。因此i
是我希望将列表A
插入列表L
的索引,而n
是我要从新列表中删除的元素数量列表从索引i
开始。
例如: 如果我跑
(splice '(1 2 3 4 5) 2 1 '(a b c))
这会给我
(1 2 a b c 4 5)
所以我在索引'(a b c)
添加了列表i
,并从索引i
开始删除了1个元素,这将是3。
答案 0 :(得分:1)
在此解决方案split
中接受延续k
,其中包含列表L
的左右部分。
(define (split L i k)
(let loop ((left '())
(right L)
(i i))
(if (> i 0)
(loop (cons (car right) left)
(cdr right)
(- i 1))
(k (reverse left) right))))
;; (split '(1 2 3 4 5) 2 (lambda x x)) => ((1 2) (3 4 5))
如何删除列表的初始元素应该是显而易见的。
(define (chop L n)
(if (> n 0)
(chop (cdr L) (- n 1))
L))
;; (chop '(3 4 5) 1) => (4 5)
如何将两个功能放在一起应该也很容易。 split
采用延续,左右两部分。继续将左侧部分追加到列表A
,然后追加到右侧部分的其余元素。
(define (splice L i n A)
(split L i
(lambda (left right)
(append left A (chop right n)))))
;; (splice '(1 2 3 4 5) 2 1 '(a b c)) => (1 2 a b c 4 5)