/ / obtener un intervalo de un vector - vector, esquema

obtener un intervalo de un vector - vector, esquema

Quiero tomar un intervalo de un vector en esquema. Sé que hay un procedimiento llamado vector->values, pero parece que devuelve cada elemento por separado, mientras que quiero obtener el resultado como un vector. ¿Cómo puedo conseguir esto?

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

mientras necesito

#(1 2 3)

Respuestas

3 para la respuesta № 1

Si está utilizando PLT, tiene algunas formas fáciles de obtener esto:

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

El último será probablemente el más rápido. La razón por la que no hay tal operación incorporada es que la gente generalmente no hace eso. Cuando se trata de vectores en Esquema, usualmente lo hace porque desea optimizar algo para devolver un vector y un rango en lugar de asignar uno nuevo es más común.

(Y si cree que esto es útil, sugiéralo en la lista de correo de PLT).


2 para la respuesta № 2

El estándar R6RS de Scheme tiene hacer-vector, vector-ref, conjunto de vectores! y longitud vectorial. Con eso podrás escribir tu propia función. subvector, que no parece ser parte de R6RS (!). Algunas implementaciones de Scheme tienen algo como subvector ya.

También puede cambiar a Common Lisp, que proporciona la función SUBSEQ en el estándar.


2 para la respuesta № 3

Aquí hay un portátil. R6RS versión usando SRFI 43:

#!r6rs

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

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

1 para la respuesta № 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))

¿Ghetto? Si mucho. Pero solo tomó dos minutos para escribir y hacer el trabajo.

(En general, es más fácil jugar con listas en Esquema)


0 para la respuesta № 5

usted quiere subvector:

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