(******************************************************************************
 * Calcul de l'expansion de Taylor d'un lambda-terme, programme principal
 *****************************************************************************)

open Lambda;;
open Diff;;
open Taylor;;

let args_list = [];;
let usage_msg = "
Usage: mltaylor t [t0]

Appelé avec un seul argument, rend la forme normale de t.
Avec deux arguments t0 est un linéarisé de la forme normale de t ; rend le
linéarisé correspondant de t.
";;

let input_term = ref Star;;
let got_term = ref false;;
let input_diff = ref DiffStar;;
let got_diff = ref false;;

if Array.length Sys.argv <= 1 || Array.length Sys.argv > 3
then
  begin
    prerr_endline usage_msg;
    exit 1
  end;

(
  try
    input_term := lambda_of_string Sys.argv.(1);
    got_term := true
  with
      Stream.Error(s) ->
        begin
          prerr_endline ("Syntax error in term: " ^ s);
          exit 1
        end
);

(
  if Array.length Sys.argv = 3
  then try
    input_diff := diff_of_string Sys.argv.(2);
    got_diff := true
  with
      Stream.Error(s) ->
        begin
          prerr_endline ("Syntax error in diff term: " ^ s);
          exit 1
        end
);

(
  try
    if not !got_diff
    then
      let normal = normalize !input_term
      in print_endline (string_of_lambda normal)
    else
      let taylor = diff_of_term !input_term !input_diff
      in print_endline (string_of_diff taylor)
  with Failure(s) ->
    prerr_endline ("Exec error: " ^s);
    exit 1
);

exit 0
;;