列出球拍拼接

时间:2017-10-31 03:16:45

标签: scheme racket r5rs

我想创建一个名为(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。

1 个答案:

答案 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)
相关问题