Bonjour !

Cela fait plusieurs fois que je suis confronté à un problème assez embêtant en Caml Light : Je ne connais pas de fonction permettant de passer de la chaîne de caractère représentant le nom d'un objet à cet objet !

Il s'agirait donc d'une fonction de string dans 'a qui d'argument une chaîne de caractère renverrait l'objet dont le nom est la chaîne de caractère.

Par exemple, admettons que cette fonction s'appelle read_string. On pourrait alors avoir la session suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
#read_string;;
- : string -> 'a = <fun>
 
#let objet=[1;2;3];;
objet : int list = [1; 2; 3]
 
#read_string "objet";;
- : int list = [1; 2; 3]
Une telle fonction serait très pratique notamment pour faire de l'interactif (mais aussi pour plein d'autres choses).

Pour l'instant, à chaque fois que j'en ai eu besoin j'ai utilisé des match exhaustifs du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
#let ersatz x = match x with
          "objet_1" -> objet_1
        | "objet_2" -> objet_2
                   (...)
        | "objet_n" -> objet_n;;
ersatz : string -> 'a = <fun>
Sauf que là j'ai un peu plus d'un demi-millier d'objets à traiter donc même si je pourrais me démerder pour faire une fonction qui affiche le code servant à faire mon match exhaustif, ça fait un peu c***. Pis je me dis que ça pourra toujours servir dans le futur.

Voilà, je résume :

- Existe-t-il une telle fonction ?
- Le cas non-échéant [lol], pourrait-on la programmer en Caml ?
- Le cas contraire [c'est mieux] y aurait-il de la programmer en C ou je sais pas quoi puis de l'ajouter au fonctions Caml ?

- Si aucun des cas précédents ne s'est présenté, y aurait-il moyen de contourner le problème ? Dans le cas présent, j'utilise du read_line pour faire de "l'interactif", un truc qui fasse que par exemple on lance un outil de recherche de mots et on peut directement taper le mot et appuyer sur entrée au lieu de devoir se farcir #rechercher "mot";; à chaque fois. Par exemple, rechercher étant une fonction de recherche dans une base de donnée, on pourrait avoir :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let read () = 
	print_string(">");
	read_line();;
read : unit -> string = <fun>
 
exception stop;;
Exception stop defined.
 
let search strng =
	if strng = "quit"
	then raise stop
	else rechercher strng;;
search : string -> unit = <fun>
 
let outil_de_recherche () = 
	print_string("Go");
        print_newline();
	try	while true 
		do
			search (read ())
		done
	with stop -> print_string("Stop");;
outil_de_recherche : unit -> unit = <fun>
Ce qui permet d'obtenir le résultat escompté. Seulement, ceci est possible car on a :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
rechercher : string -> unit = <fun>
Mais admettons que rechercher soit de int list dans unit, ça ne marcherait pas. C'est dommage, non ? Alors, comment faire ?