Pregunta

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

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

mientras necesito:

#(1 2 3)
¿Fue útil?

Solución

Si estás usando PLT, tienes 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 probablemente será 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, normalmente lo hace porque desea optimizar algo, por lo que es más común devolver un vector y un rango en lugar de asignar uno nuevo.

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

Otros consejos

El estándar Scheme R6RS tiene make-vector , vector-ref , vector-set! y vector-length . Con eso puedes escribir tu propia función subvector , que no parece ser parte de R6RS (!). Algunas implementaciones de Scheme ya tienen algo como subvector .

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

Aquí hay una versión portátil de R6RS utilizando 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))

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

(Creo que generalmente es más fácil jugar con listas en Esquema)

desea < código> subvector :

(subvector (vector 1 2 3 4 5) 0 3)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top