Question

Je veux prendre un intervalle d'un vecteur dans Scheme. Je sais qu’il existe une procédure nommée vecteur- > valeurs , mais il me semble qu’elle renvoie chaque élément séparément, alors que je souhaite obtenir le résultat sous forme de vecteur. Comment puis-je y parvenir?

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

alors que j'ai besoin de:

#(1 2 3)
Était-ce utile?

La solution

Si vous utilisez le PLT, vous disposez de quelques moyens simples pour l'obtenir:

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

Le dernier va probablement être le plus rapide. La raison pour laquelle aucune opération de ce type n'est intégrée est que les gens ne le font généralement pas. Lorsque vous utilisez des vecteurs dans Scheme, vous le faites généralement parce que vous souhaitez optimiser quelque chose. Il est donc plus courant de renvoyer un vecteur et une plage au lieu d'en attribuer une nouvelle.

(Et si vous pensez que cela est utile, merci de le suggérer sur la liste de diffusion PLT.)

Autres conseils

La norme Scheme R6RS a vecteur de création , vecteur de référence , ensemble de vecteurs! et vecteur de longueur . Avec cela, vous pouvez écrire votre propre fonction subvector , qui ne semble pas faire partie de R6RS (!). Certaines implémentations Scheme ont déjà quelque chose comme subvector .

Vous pouvez également passer à Common Lisp, qui fournit la fonction SUBSEQ dans la norme.

Voici une version R6RS portable utilisant 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))

Ghetto? Oui très. Mais cela n'a pris que deux minutes pour écrire et faire le travail.

(Je trouve qu'il est généralement plus facile de jouer avec des listes dans Scheme)

vous voulez < code> sous-vecteur :

(subvector (vector 1 2 3 4 5) 0 3)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top