Blog de Laurent Bloch
Blog de Laurent Bloch

ISSN 2271-3980
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets informatiques et mes enseignements.

Pour recevoir (au plus une fois par semaine) les nouveautés de ce site, indiquez ici votre adresse électronique :

Vecteurs de Bigloo
Article mis en ligne le 4 février 2005
dernière modification le 11 mars 2021

par Laurent Bloch

Cet article signale quelques extensions au type vecteur du Scheme standard qui peuvent être utiles pour réaliser des programmes efficaces.

La plupart des Scheme modernes proposent des vecteurs homogènes, c’est-à-dire dont tous les éléments sont de même type, ce qui autorise de meilleures performances, notamment s’il s’agit d’éléments de types scalaires (nombres ou caractères). On pourra consulter à ce sujet le document de normalisation relatif aux vecteurs homogènes de types numériques : Bigloo ne comporte pas cette extension, ce qui ne veut pas dire qu’elle est inutilisable avec lui (il suffit de recopier les programmes sources, éventuellement de les adapter). Incidemment, il y a une adaptation à Bigloo d’une bibliothèque complémentaires d’opérations sur les vecteurs, ainsi qu’un type vecteur homogène numérique non documenté tvector, au sujet duquel je cite Manuel Serrano :

Bigloo already contains (undocumented) homogeneous vector types. Even if this feature is currently left undocumented, homogeneous vectors are likely to stick in Bigloo for a very long time because they are at the heart of the CFA optimization that is able to automatically transform Bigloo vectors in homogeneous vectors.

Since there is no documentation, you will have to figure out by yourself how to use typed vectors. To get you started, here is a small example :

  1. (module foo
  2.    (type (tvector vint (int)))
  3.    (main main))
  4.  
  5. (define (f v)
  6.    (let loop ((i (-fx (vint-length v) 1))
  7.               (a 0))
  8.       (if (=fx i -1)
  9.           a
  10.           (loop (-fx i 1) (+fx a (vint-ref v i))))))
  11.  
  12. (define (main a)
  13.    (print (make-vint 4 2))
  14.    (print (f (make-vint 10 1))))

Télécharger

Sur la liste de diffusion de Bigloo, Will M. Farr a posté cet autre exemple :

— So, my question is, does Bigloo have something like an SRFI-4
implementation ?

— No, but you can hack one pretty quickly. Use the declaration (for example) :

This generates all the standard vector functions for f64vectors. They will not automatically print at the REPL, but they will print using an explicit (print ...) statement. The procedure (make-f64vector n init) *requires* the
init value (slightly different from SRFI-4). The tvector is stored in a struct object which looks like :

  1. struct bgl_tvector_of_BgL_doublez00 {
  2.    header_t header;
  3.    long     length;
  4.    obj_t    descr;
  5.    double el0;
  6. };

Télécharger

Just use a pragma form (described in the C interface) to get a pointer to el0, and you’re ready to pass them to C functions.


Dans la même rubrique