Php et Ocaml

Php et Ocaml - PHP - Programmation

Marsh Posté le 19-03-2005 à 19:21:53    

Salut
Pour un projet de TIPe, je cherche a communiqué entre PHP et OCaml : je m'explique :
Je voudrais que l'utilisateur entre des entrées, que Caml résoud le problème et que php affiche le résultat sur une page html.
J'ai pensé a ce que le fichier php créé (ou modifie plus exactement) mon fichier test.ml, puis qu'il lance la complation grace a la commande exec(ocamlc -o test.ml ...). J'obtiendrais ainsi un fichier executable. Il me faut alors lire les informations qui sortent de ce ficier executable par php et les traitées... Je voulaus éssayé par exec aussi, mais je n'y arrive pas (cf sujet [php] 66467).
 
Existe t-il une manière plsu simlpe de communiqué entre php et OCaml ou quelqu'un peut-il m'aiguiller sur une alternative a ma tentative?
Merci d'avance ...

Reply

Marsh Posté le 19-03-2005 à 19:21:53   

Reply

Marsh Posté le 20-03-2005 à 13:31:22    

Je ne vois pas l'interet de compiler ton prog ocaml a la volee. Tu compiles une bonne fois pour toutes et tu appelles l'exe genere via PHP avec les parametres qui vont bien. C'est pas plus complique que ca.

Reply

Marsh Posté le 21-03-2005 à 19:08:59    

mais je ne sais pas comment envoyé des paramétres a un programme caml d"ja compilé. Peux-tu m'expliqué stp?
Sinon, j'ai quand même du mal à récupéré le retour avec php

Reply

Marsh Posté le 21-03-2005 à 22:40:46    

Je réussi a ratrappé le retour, mais comment peut-on envoyé des paramètres en entrée d'un fichier déja compilé stp? (ca m'éviterais pas mal de ligne de code ;) ...

Reply

Marsh Posté le 21-03-2005 à 22:57:03    

goodspirit a écrit :

Je réussi a ratrappé le retour, mais comment peut-on envoyé des paramètres en entrée d'un fichier déja compilé stp? (ca m'éviterais pas mal de ligne de code ;) ...

Soit tu passes tes paramètres en arguments quand tu appelles ton programme [:petrus75], soit tu utilises des sockets [:spamafote]  

Reply

Marsh Posté le 21-03-2005 à 23:42:37    

oui, ca j'avais bien compris mais ma question consistait surtout a savoir comment les arguments sont-ils récupérer par le programme Caml (comment faire mon programme caml et que passer en argument pour qu'il l'utilise?) (Désolé, je suis moins bon en Caml qu'en php et j'ai conscience que ce post traite maintenant plus de Caml que de php)

Reply

Marsh Posté le 22-03-2005 à 00:18:10    

goodspirit a écrit :

oui, ca j'avais bien compris mais ma question consistait surtout a savoir comment les arguments sont-ils récupérer par le programme Caml (comment faire mon programme caml et que passer en argument pour qu'il l'utilise?) (Désolé, je suis moins bon en Caml qu'en php et j'ai conscience que ce post traite maintenant plus de Caml que de php)


(ça tombe très bien, je ne connais rien du tout au php [:petrus75] )
 
Les arguments sont dans Sys.argv. C'est une array (de string), donc tu peux avoir le nombre d'arguments avec

Code :
  1. Array.length Sys.argv;;

Pour récupérer le premier argument:

Code :
  1. Sys.argv.(1);;

(c'est la même chose que Array.get Sys.argv 1)
 
Tu peux bien sûr faire un open Array;; au début si tu ne veux pas te taper le "Array.bidule" et utiliser directement "bidule" :o  
 
Je ne sais pas trop quel est ton niveau, donc un petit exemple bien détaillé:

Code :
  1. open Array;;
  2. open Sys;;
  3. (* pour l'exemple, je vais considérer que tu passes en argument deux entiers *)
  4. (* traiter prend deux strings contenant un nombre en argument et retourne une
  5. * string contenant le résultat *)
  6. let traiter x y =
  7.     let a = int_of_string x in
  8.     let b = int_of_string y in
  9.     (* ici tu fais ton gros calcul très compliqué *)
  10.     let resultat = a + b in
  11.     string_of_int resultat
  12. ;;
  13. (* on n'a plus qu'à récupérer les arguments *)
  14. if length argv > 2
  15.    (* et à afficher le résultat après l'avoir calculé *)
  16.    then print_endline (traiter argv.(1) argv.(2));;


Bien sûr, tu n'es pas obligé d'utiliser une demi douzaine d'identifiants pour rien, tu peux vérifier que les arguments passés à "traiter" sont corrects (int_of_string lève une exception si ce n'est pas le cas, tu peux l'attraper avec try...with), tu peux passer toutes tes variables en un seul argument (en utilisant des guillemets) puis parser à coup de Scanf.sscanf [:petrus75], etc...
 
Et là normalement:

$ ./le_nom_du_programme 12 15
27


 
Si veux apprendre un peu l'ocaml, tu peux en trouver la référence sur le site du langage, et parcourir ce bouquin.

Reply

Marsh Posté le 23-03-2005 à 00:57:06    

Merci beaucoup, ta réponse est très précise et claire, c'est parfait. Je vais testé ca dès que possible et te dire quoi. Merci...

Reply

Marsh Posté le 23-03-2005 à 01:09:26    

ok, ca marche, j'arrive a récupéré mes arguments.
Cependant, j'ai pas compris ce passage de ta réponse : existerait-il une méthode simple pour récupéré plusieurs arguments (j'ai 48 entiers a passer en arguments mais je peux utiliser Sys.argv.(1);; ... Sys.argv.(48);; puisque l'ordre et rigoureux et je n'ai à les utiliser qu'une seule fois dans le programme.

Pillow a écrit :

(ça tombe très bien, je ne connais rien du tout au php [:petrus75] )
Bien sûr, tu n'es pas obligé d'utiliser une demi douzaine d'identifiants pour rien, tu peux vérifier que les arguments passés à "traiter" sont corrects (int_of_string lève une exception si ce n'est pas le cas, tu peux l'attraper avec try...with), tu peux passer toutes tes variables en un seul argument (en utilisant des guillemets) puis parser à coup de Scanf.sscanf [:petrus75], etc...


En tout cas, merci beaucoup, ca me simplifie pas mal le travail...

Reply

Marsh Posté le 23-03-2005 à 03:03:47    

goodspirit a écrit :

ok, ca marche, j'arrive a récupéré mes arguments.
Cependant, j'ai pas compris ce passage de ta réponse : existerait-il une méthode simple pour récupéré plusieurs arguments (j'ai 48 entiers a passer en arguments mais je peux utiliser Sys.argv.(1);; ... Sys.argv.(48);; puisque l'ordre et rigoureux et je n'ai à les utiliser qu'une seule fois dans le programme.
 
En tout cas, merci beaucoup, ca me simplifie pas mal le travail...

Ce que je disais, c'est que tu pourrais par exemple appeller ton programme comme ça :

Code :
  1. mon_programe "8 6"


Et ensuite récupérer les données comme ça:

Code :
  1. let mes_donnees = Scanf.sscanf Sys.argv.(1) "%i %i" (fun a b c-> [a; b]);;
  2. (* mes_donnees est dorénavant la liste [8; 6]

L'intérêt? Il n'y en a pas. Je voulais juste montrer qu'il y a d'autres possibilités [:petrus75]  
 
Je voulais aussi souligner que si par malheur un de tes arguments n'est pas un entier, l'application s'arrêtera. Dans ton cas il y a probablement très peu de chances que ça se produise et ce ne serait certainement pas vraiment grave, mais si on voulait être complet on traiterait le cas. Comme ça:  

Code :
  1. try
  2.     (* tout les exceptions levées dans ce bloc pourront être traitées avec le
  3.     * with *)
  4.     let a = int_of_string x in
  5.     let b = int_of_string y in
  6.     print_int (a + b);
  7.     print_newline ()
  8. with (* Ici on rattape les exceptions en utilisant le filtrage *)
  9.   _ -> print_endline "Oulalah il y a une erreur!!"

L'underscore (_) signifiant qu'on rattrape toutes les exceptions, mais je suppose que tu savais déjà ça. Bien sûr on peux faire tout ce qu'on veut quand on rattrape une exception, et on peut faire un traitement séparé pour chaque exception:

Code :
  1. with
  2.   Failure "int_of_string" -> print_endline "La chaine n'était pas un entier"
  3.   | Invalid_argument _ -> (
  4.       print_string "argument invalide! Pour la peine je vais écrire 25 000 000";
  5.       print_endline " fois \"foo\" à l'écran et je lève une exception.  ";
  6.       ecrire_foo 25000000;
  7.       raise (Failure "Attrape moi si tu peux!" )
  8.   )

Bref, je crois que j'ai un peu digressé :whistle:  
 
 
J'imagine que tu sais déjà ça, mais au cas où : pour transformer tes 48 arguments en entiers, l'idéal serait de faire un tableau et une boucle:

Code :
  1. let donnees = Array.make 48 0;; (* un tableau de 48 éléments, qui valent tous 0 *)
  2. for i=1 to 48
  3. do
  4.     donnees.(i-1) <- int_of_string Sys.argv.(i);
  5. done;;

Ensuite tu peux bien sûr utiliser les données à coup de donnees.(0), donnees.(1), etc.
A la rigueur si ton traitement est simple (par exemple, faire l'addition de tous les paramètres) tu peux te passer de cette étape.
 
 
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed