我想在Scheme中取一个向量的间隔。我知道有一个名为vector->values
的过程,但似乎它分别返回每个元素,而我想将结果作为向量。我怎样才能做到这一点?
> (vector->values (vector 1 2 3 4 5) 0 3)
1
2
3
虽然我需要:
#(1 2 3)
答案 0 :(得分:3)
如果你正在使用PLT,你可以通过几种简单的方法来实现这一目标:
(define (subvector v start end)
(list->vector (for/list ([i (in-vector v start end)]) i)))
(define (subvector v start end)
(build-vector (- end start) (lambda (i) (vector-ref v (+ i start)))))
(define (subvector v start end)
(define new (make-vector (- end start)))
(vector-copy! new 0 v start end)
new)
最后一个可能是最快的。没有这种内置操作的原因是人们通常不这样做。当您在Scheme中处理向量时,通常这样做是因为您想要优化某些内容,因此返回向量和范围而不是分配新的更常见。
(如果你认为这很有用,请在PLT邮件列表上提出建议。)
答案 1 :(得分:2)
Scheme R6RS标准有 make-vector , vector-ref , vector-set!和 vector-length 。有了它,你可以编写自己的函数子向量,它似乎不是R6RS(!)的一部分。一些Scheme实现已经有类似 subvector 的东西了。
您也可以切换到Common Lisp,它在标准中提供SUBSEQ功能。
答案 2 :(得分:2)
#!r6rs
(import (rnrs base)
(prefix (srfi :43) srfi/43:))
(srfi/43:vector-copy (vector 1 2 3 4 5) 0 3)
答案 3 :(得分:1)
#lang scheme
(define (my-vector-value v l h c)
(if (and (>= c l) (< c h))
(cons (first v) (my-vector-value (rest v) l h (add1 c)))
empty))
(list->vector (my-vector-value (vector->list (vector 1 2 3 4 5)) 0 3 0))
隔都?是的,非常。但是只需要两分钟的时间来完成工作。
(我发现使用Scheme中的列表通常更容易)
答案 4 :(得分:0)
你想要subvector
:
(subvector (vector 1 2 3 4 5) 0 3)