[英]List splicing in racket
我想创建一个名为(splice L in 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)
所以我在索引i
处添加了列表'(abc)
并删除了从索引i
开始的 1 个元素,这将是 3。
在这个解决方案中, 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.