/ / uzyskiwanie przedziału wektor - wektor, schemat

uzyskanie przedziału wektora - wektor, schemat

Chcę zrobić interwał wektora w schemacie. Wiem, że istnieje procedura nazwana vector->values, ale wygląda na to, że zwraca każdy element oddzielnie, podczas gdy chcę uzyskać wynik jako wektor. Jak mogę to osiągnąć?

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

gdy potrzebuję:

#(1 2 3)

Odpowiedzi:

3 dla odpowiedzi № 1

Jeśli używasz PLT, masz kilka prostych sposobów, aby to uzyskać:

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

Ten ostatni będzie prawdopodobnie najszybszy. Powodem, dla którego nie ma takiej wbudowanej operacji, jest to, że ludzie zwykle tego nie robią. Kiedy zajmujesz się wektorami w Schemacie, zazwyczaj robisz to, ponieważ chcesz zoptymalizować coś tak zwracającego wektor i zakres zamiast przydzielania nowego jest bardziej powszechny.

(A jeśli uważasz, że jest to przydatne, zasugeruj to na liście mailingowej PLT).


2 dla odpowiedzi nr 2

Standard R6RS ma make-vector, wektor-ref, wektor zestaw! i długość wektora. Dzięki temu możesz napisać własną funkcję subvector, który nie wydaje się być częścią R6RS (!). Niektóre implementacje Schematu mają coś takiego subvector już.

Możesz także przełączyć się na Common Lisp, który zapewnia funkcję SUBSEQ w standardzie.


2 dla odpowiedzi nr 3

Oto przenośny R6RS wersja używa SRFI 43:

#!r6rs

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

(srfi/43:vector-copy (vector 1 2 3 4 5) 0 3)

1 dla odpowiedzi nr 4
#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))

Getto? Tak, bardzo. Ale napisanie i wykonanie zadania zajęło tylko dwie minuty.

(Uważam, że ogólnie łatwiej jest grać z listami w Schemacie)


0 dla odpowiedzi № 5

chcesz subvector:

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