繁体   English   中英

球拍中的列表拼接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM