let rec print_aexp  (a: aexp) = match a with
          N(n)              ->  "N("^ (string_of_int n) ^")"
    | R(f)              ->  "R("^ (string_of_float f) ^")"
        | Var(id)           ->  "Var("^ (print_ide id) ^")"
    | Vec(id,ex)        ->  "Vec("^ (print_ide id) ^","^ (print_aexp ex) ^")"
    | Mat(id,ex1,ex2)   ->  "Mat("^ (print_ide id) ^","^ (print_aexp ex1) ^","^ (print_aexp ex2) ^")"
        | Sum(ex1,ex2)      ->  "Sum("^ (print_aexp ex2) ^","^ (print_aexp ex2) ^")"
    | Sub(ex1,ex2)      ->  "Sub("^ (print_aexp ex2) ^","^ (print_aexp ex2) ^")"
        | Mul(ex1,ex2)      ->  "Mul("^ (print_aexp ex2) ^","^ (print_aexp ex2) ^")"
        | Div(ex1,ex2)      ->  "Div("^ (print_aexp ex2) ^","^ (print_aexp ex2) ^")"
    | FCall(id,exl)     ->  "FCall("^ (print_ide id) ^",["^ (print_string_list(List.map print_aexp exl)) ^"])"