球拍中的列表拼接
List splicing in racket
我想创建一个名为 (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)
所以我在索引 i
处添加了列表 '(a b c)
并删除了从索引 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
取continuation,即获取左右两部分。并且延续将列表 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)
我想创建一个名为 (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)
所以我在索引 i
处添加了列表 '(a b c)
并删除了从索引 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
取continuation,即获取左右两部分。并且延续将列表 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)