2009-10-23 24 views
2

我想在Scheme中取一個向量的區間。我知道有一個名爲vector->values的程序,但好像它會分別返回每個元素,而我想要將結果作爲一個向量。我怎樣才能做到這一點?得到一個向量的區間

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

,而我需要:

#(1 2 3) 

回答

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郵件列表。)

+0

這比我的解決方案好100倍 –

+0

看起來像PLT特定的,可移植的Scheme版本如何? –

+1

Rainer,如果你關心它,請隨時自己動手。我會忽略火焰mpts,而不是完成實際的工作。 –

0

你想subvector

(subvector (vector 1 2 3 4 5) 0 3) 
+1

好像drscheme沒有程序子矢量:( – Hellnar

+0

MIT Scheme,但不是在Scheme標準中 –

2

該計劃R6RS標準有化妝矢量矢量-REF矢量集!矢量長度。有了這個,你可以編寫自己的函數子向量,這似乎不是R6RS(!)的一部分。一些Scheme實現已經有類似子向量

您也可以切換到Common Lisp,它提供標準中的SUBSEQ功能。

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)) 

貧民窟?是的,非常。但只花了兩分鐘的時間來完成工作。

(我覺得它通常更容易在計劃列表播放)

+0

看起來像* add1 *和* empty *不在Scheme標準中。 –

2

下面是一個便攜版本R6RS使用SRFI 43

#!r6rs 

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

(srfi/43:vector-copy (vector 1 2 3 4 5) 0 3) 
相關問題