给定一个列表,我怎么会选择一个新的列表,包含原始列表的片段(定偏移量和元素的数量)?
编辑:
好的建议为止。 是不是有在SRFI的一个规定的东西吗? 这似乎是一个非常基本的东西,所以我很惊讶,我要实现它在用户空间。
给定一个列表,我怎么会选择一个新的列表,包含原始列表的片段(定偏移量和元素的数量)?
好的建议为止。 是不是有在SRFI的一个规定的东西吗? 这似乎是一个非常基本的东西,所以我很惊讶,我要实现它在用户空间。
下面的代码会做你想要什么:
(define get-n-items
(lambda (lst num)
(if (> num 0)
(cons (car lst) (get-n-items (cdr lst) (- num 1)))
'()))) ;'
(define slice
(lambda (lst start count)
(if (> start 1)
(slice (cdr lst) (- start 1) count)
(get-n-items lst count))))
例:
> (define l '(2 3 4 5 6 7 8 9)) ;'
()
> l
(2 3 4 5 6 7 8 9)
> (slice l 2 4)
(3 4 5 6)
>
奇怪的是, slice
不具备SRFI-1 ,但你可以把它缩短了使用SRFI-1的take
和drop
:
(define (slice l offset n)
(take (drop l offset) n))
我以为我已经计划使用的扩展之一,如PLT方案库或诈骗,就会有这样的内置,但它似乎并不如此。 它甚至在新R6RS库中定义。
你可以试试这个功能:
SUBSEQ 顺序起动&可选的结束
开始参数为您所抵消。 结束参数可以通过简单地增加开始+数的元素可以容易地转变成元件的数目,以抓住。
一个小的好处是,SUBSEQ适用于所有的序列,这不仅包括列表,而且字符串和载体。
编辑:这似乎并不是所有的Lisp实现都SUBSEQ,虽然它会做的工作就好了,如果你拥有它。
(define (sublist list start number)
(cond ((> start 0) (sublist (cdr list) (- start 1) number))
((> number 0) (cons (car list)
(sublist (cdr list) 0 (- number 1))))
(else '())))
下面是我实现slice
使用适当的尾部调用
(define (slice a b xs (ys null))
(cond ((> a 0) (slice (- a 1) b (cdr xs) ys))
((> b 0) (slice a (- b 1) (cdr xs) (cons (car xs) ys)))
(else (reverse ys))))
(slice 0 3 '(A B C D E F G)) ;=> '(A B C)
(slice 2 4 '(A B C D E F G)) ;=> '(C D E F)
尝试是这样的:
(define (slice l offset length)
(if (null? l)
l
(if (> offset 0)
(slice (cdr l) (- offset 1) length)
(if (> length 0)
(cons (car l) (slice (cdr l) 0 (- length 1)))
'()))))