[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 1997-06-03 (10:04) |
From: | Vincent Poirriez <Vincent.Poirriez@u...> |
Subject: | Re: Instruction return |
> > > Serait-il possible d'ajouter une instruction return au langage CAML afin > > de pouvoir sortir directement d'une boucle, > ... Je souscrit a la réponse de Pierre Weis >C'est pourquoi on pre'fe`re alors conside'rer que la >boucle est trop complexe pour une boucle for ou while et qu'il est >temps d'utiliser des outils adapte's a` e'crire des boucles >arbitrairement complexes, c'est-a`-dire les fonctions re'cursives. Cependant, j'ai rencontré la situation suivante dans un contexte où l'efficacité (à l'exécution) est essentielle. Trouver l'indice du premier élément d'un tableau qui vérifie un prédicat p, s'il y en a un. Ce code étant compile avec l'option -unsafe, je ne peux pas compter sur les test de débordement des primitives Array.get ... Le choix d'utiliser Array.unsafe_get serait inutile si j'inclus ce test de débordement dans la condition du while ou de la fonction récursive ainsi: let find p a = let l = Array.length a in let i = ref 0 in while !i<l & not( p (Array.unsafe_get a !i) do incr i done; !i J'ai donc prefere le coût d'un try ... with: exception Exit_for of int let find p a = let l = Array.length a in try for i = 0 to l-1 do if p (Array.unsafe_get a i) then raise Exit_for i done; l with Exit_for i -> i Si l'on veut sortir d'une boucle for avant sa fin normale, en admettant que ce soit justifié (while ou fonction récursive exclue) , la valeur de sortie du compteur suffit. English short version: I agree with Pierre Weis: >In fact the best way of writing complex loops is via recursive >function definitions: But, due to runtime efficiency considerations I had to make the following choice. I want to find the index of the first item of an array which verifies a predicat p, if one exists. It is useless to prefer Array.unsafe_get if I add the test in the while (or recursive) condition as below: let find p a = let l = Array.length a in let i = ref 0 in while !i<l & not( p (Array.unsafe_get a !i) do incr i done; !i I prefer to pay the cost of one try ... with ... exception Exit_for of int let find p a = let l = Array.length a in try for i = 0 to l-1 do if p (Array.unsafe_get a i) then raise Exit_for i done; l with Exit_for i -> i When I want to exit a loop for before its natural end, when I really need it, it is sufficient to return the value of the count when I exit Vincent Poirriez -- Tel: (33) {0}3 27 14 13 33 Fax: (33) {0}3 27 14 12 94 mailto:Vincent.Poirriez@univ-valenciennes.fr http://www.univ-valenciennes.fr/limav/poirriez ISTV Université de Valenciennes Le Mont Houy BP 311 F59304 Valenciennes CEDEX