[OCaml] Pretty printer et fonctions mutuellements récursives

Résolu
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;;


1 réponse

  1. Modérateur
    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
    1. Ah merci beaucoup, mon code compile à présent.
      Merci :-)
      0