Scheme 球拍中的列表拼接

Scheme 球拍中的列表拼接,scheme,racket,r5rs,Scheme,Racket,R5rs,我想创建一个名为(拼接L I n a)的过程,其中L是一个列表,I是一个索引,n是元素的数量,a是另一个列表。因此,i是我想将列表A插入列表L的索引,n是我想从索引i开始的新列表中删除的元素数 例如: 如果我跑 这会给我 (1 2 a b c 4 5) 因此,我在索引I中添加了列表(a b c),并删除了从索引I开始的1个元素,这将是3个元素。在这个解决方案中拆分接受一个延续k,它将占据列表的左右部分L (define (split L i k) (let loop ((left '())

我想创建一个名为
(拼接L I n a)
的过程,其中
L
是一个列表,
I
是一个索引,
n
是元素的数量,
a
是另一个列表。因此,
i
是我想将列表
A
插入列表
L
的索引,
n
是我想从索引
i
开始的新列表中删除的元素数

例如: 如果我跑

这会给我

(1 2 a b c 4 5)

因此,我在索引
I
中添加了列表
(a b c)
,并删除了从索引
I
开始的1个元素,这将是3个元素。

在这个解决方案中
拆分
接受一个延续
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)

你的问题是什么?你尝试了什么,在哪里卡住了?这是家庭作业吗?我能够在索引I处将列表A拼接到列表L中,但我不知道如何从原始列表I处删除n个元素
(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)