我想在Scheme中取一個向量的區間。我知道有一個名爲vector->values
的程序,但好像它會分別返回每個元素,而我想要將結果作爲一個向量。我怎樣才能做到這一點?得到一個向量的區間
> (vector->values (vector 1 2 3 4 5) 0 3)
1
2
3
,而我需要:
#(1 2 3)
我想在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郵件列表。)
該計劃R6RS標準有化妝矢量,矢量-REF,矢量集!和矢量長度。有了這個,你可以編寫自己的函數子向量,這似乎不是R6RS(!)的一部分。一些Scheme實現已經有類似子向量。
您也可以切換到Common Lisp,它提供標準中的SUBSEQ功能。
#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))
貧民窟?是的,非常。但只花了兩分鐘的時間來完成工作。
(我覺得它通常更容易在計劃列表播放)
看起來像* add1 *和* empty *不在Scheme標準中。 –
這比我的解決方案好100倍 –
看起來像PLT特定的,可移植的Scheme版本如何? –
Rainer,如果你關心它,請隨時自己動手。我會忽略火焰mpts,而不是完成實際的工作。 –