我想在Scheme中取一个向量的间隔。我知道有一个名为 vector-> values 的过程,但似乎它分别返回每个元素,而我想将结果作为向量。我怎样才能做到这一点?

> (vector->values (vector 1 2 3 4 5) 0 3)
1
2
3

虽然我需要:

#(1 2 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邮件列表上提出建议。)

其他提示

Scheme R6RS标准有 make-vector vector-ref vector-set! vector-length 。有了它,你可以编写自己的函数子向量,它似乎不是R6RS(!)的一部分。一些Scheme实现已经有类似 subvector 的东西了。

您也可以切换到Common Lisp,它在标准中提供SUBSEQ功能。

以下是使用 R6RS 版本。 org / srfi-43 / srfi-43.html“rel =”nofollow noreferrer“> SRFI 43 :

#!r6rs

(import (rnrs base)
        (prefix (srfi :43) srfi/43:))

(srfi/43:vector-copy (vector 1 2 3 4 5) 0 3)
#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中的列表通常更容易)

你想 <代码>子矢量

(subvector (vector 1 2 3 4 5) 0 3)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top