使用let ... in的OCaml语法错误

时间:2012-05-04 11:20:31

标签: ocaml syntax-error

我认为我有一个非常简单的问题,但无法弄清楚出了什么问题。 我想打开一个文件并尝试使用自定义消息失败,如果该文件不存在或其他原因。

这是我的代码(对不起法国评论):

if (argc = 1) then
    aide ()
else
    (* Si plus d'un argument, on récupère le type *)
    if argc >= 2 then
        let stage = int_of_string (Sys.argv.(1)) in
            if stage != 0 && stage != 1 then
                aide ()
            else
                ()
    else
        ()
    ;    
    (* Si plus de deux arguments, on récupère aussi l'entrée *)
    if argc >= 3 then
        let filename = Sys.argv.(2) in
        let input =
        try
            open_in filename
        with _ -> failwith ("Impossible d'ouvrir le fichier " ^ filename)
    else
        ()
    ;
;;

我在with关键字上出现语法错误。 有人有想法吗?感谢。

2 个答案:

答案 0 :(得分:4)

发生错误是因为您将input绑定到某个值但未在then分支中返回任何内容。

您应该使用值input执行某些操作,并在()阻止后返回try/with

if argc >= 3 then
    let filename = Sys.argv.(2) in
    let input = (* The error is in this line *)
    try
        open_in filename
    with _ -> failwith ("Impossible d'ouvrir le fichier " ^ filename)
else
    ()

答案 1 :(得分:0)

你的问题是你的代码什么都不做,你定义了值«input»但是没有使用它,Ocaml不喜欢什么都不做的代码。你应该写这样的东西:

if (argc = 1) then
    aide ()
else begin
    (* Si plus d'un argument, on récupère le type *)
    if argc >= 2 then
        let stage = int_of_string (Sys.argv.(1)) in
            if stage != 0 && stage != 1 then
                aide ()
            else
                ()
    else
        ()
    ;    
    (* Si plus de deux arguments, on récupère aussi l'entrée *)
    if argc >= 3 then
        let filename = Sys.argv.(2) in
        let input =
        try
            open_in filename
        with _ -> failwith ("Impossible d'ouvrir le fichier " ^ filename)
        in
        (* Le code principal du programme qui utilise la valeur input *)
    else
        ()
    ;
end;;

您的代码的其他评论:

  1. 我认为你不想使用«failwith(“Impossible d'ouvrir le fichier”^ filename)»因为它会引发一个不会被捕获的异常。您已经抓住它,因此打印错误消息并退出:

    (print_endline ("Impossible d'ouvrir le fichier " ^ filename); exit 1)
    
  2. 您应该使用«开始»和«结束»