[OCaml] Pretty printer et fonctions mutuellements récursives

Résolu
Sauvegarde2 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   -  
Sauvegarde2 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je dois faire écrire un pretty-printer qui va imprimer du json mais je n'arrive pas à m'en sortir à cause de print_jvalue qui a besoin de print_jobject et vice & versa.

Je sais que la fonction ressemble à un gros tas mais ce sont les 'and' et les 'in' qui sont importants, je les aient mis en valeur.

Pouvez-vous m'aider ?

Le code :

let print_json json =
	let rec print_jvalue v = match v with
		| String_val s ->
			print_char '"';
			print_string s;
			print_char '"'
		| Number_val n -> print_float n
		| Object_val o -> print_jobject o
		| Array_val  a -> print_jarray a
		| Bool_val   b -> print_bool b
		| Null_val     -> print_string "null" and
	print_list o print_content = match o with
		| t::[] ->
			print_content t
		| t::c ->
			print_content t;
			print_string ",\n";
			print_list c print_content in
	let inner_print o delimiters print_content =
		print_char delimiters.[0];
		print_string "\n\t";
		print_list o print_content;
		print_char delimiters.[1];
		print_string "\n" in
	let print_jobject o = inner_print o "{}" print_jvalue in
	let print_jarray a = inner_print a "[]" print_jobject in
	print_jobject json;;


A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tu dois déclarer tes fonctions qui se croisent en même temps (au sein du même let)

Donc je n'ai pas pu vérifié puisqu'il me manque deux trois trucs (Number_val, etc.), mais de tête ça doit faire quelque chose comme ça :

let print_json json = 

    let rec print_list o print_content = match o with 
        | t::[] -> 
            print_content t 
        | t::c -> 
            print_content t; 
            print_string ",\n"; 
            print_list c print_content in 

    let inner_print o delimiters print_content = 
        print_char delimiters.[0]; 
        print_string "\n\t"; 
        print_list o print_content; 
        print_char delimiters.[1]; 
        print_string "\n" in 

    let rec print_jvalue v = match v with 
        | String_val s -> 
            print_char '"'; 
            print_string s; 
            print_char '"' 
        | Number_val n -> print_float n 
        | Object_val o -> print_jobject o 
        | Array_val  a -> print_jarray a 
        | Bool_val   b -> print_bool b 
        | Null_val     -> print_string "null" 

    and print_jobject o = inner_print o "{}" print_jvalue 
    and print_jarray a = inner_print a "[]" print_jobject in 
     
    print_jobject json;;
La confiance n'exclut pas le contrôle
1
Sauvegarde2 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   261
 
Ah merci beaucoup, mon code compile à présent.
Merci :-)
0