首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCaml Printf.printf -缺失输出谜团

OCaml Printf.printf -缺失输出谜团
EN

Stack Overflow用户
提问于 2014-07-15 11:50:21
回答 1查看 2.1K关注 0票数 1

下面的代码..。

代码语言:javascript
复制
type 'a osResult =
  Success of 'a
| Error of string


let errorCatcher f =
  try
    let result = f () in
    Success result
  with Unix.Unix_error (code, fun_name, arg) ->
    Error(String.concat ":" [(Unix.error_message code); fun_name; arg])

let my_getcwd () = 
  errorCatcher (fun () -> Unix.getcwd ())

let _ =
  print_endline "The Start";
  let result = my_getcwd () |> function
  | Success folder -> Printf.sprintf "getcwd:\n\t%s\n" folder
  | Error errMessage -> Printf.sprintf "getcwd (error):\n\t%s\n" errMessage
  in
  print_string result ;
  print_endline "The End."
;;

...compiles罚款:

代码语言:javascript
复制
$ corebuild -tag debug test1.native

...and运行良好:

代码语言:javascript
复制
$ ./test1.native 
The Start
getcwd:
        /home/ttsiod/work/byePythonHelloOCaml
The End.

但如果我把主体改为:

代码语言:javascript
复制
let _ =
  print_endline "The Start";
  my_getcwd () |> function
  | Success folder -> Printf.printf "getcwd:\n\t%s\n" folder
  | Error errMessage -> Printf.printf "getcwd (error):\n\t%s\n" errMessage
  ;
  print_endline "The End."
;;

..。然后最后的打印语句(“结束”)就会丢失或者什么的.

代码语言:javascript
复制
$ ./test2.native 
The Start
getcwd:
        /home/ttsiod/work/byePythonHelloOCaml

最初,我认为这是一个标准缓冲不被刷新的情况。

但是print_endline的文档显然声称它会刷新标准文件,所以我感到很困惑--加上“刷新”也没有帮助:

代码语言:javascript
复制
let _ =
  print_endline "The Start";
  my_getcwd () |> function
  | Success folder -> Printf.printf "getcwd:\n\t%s\n" folder
  | Error errMessage -> Printf.printf "getcwd (error):\n\t%s\n" errMessage
  ;
  print_endline "The End." ;
  flush stdout
;;

帮助?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-15 12:13:54

print_endline被视为Error案例的一部分。从缩进来看,这显然不是您的意思,但不幸的是,OCaml编译器没有对此发出警告。

您可以使用beginend (或者只是括号)来使其工作:

代码语言:javascript
复制
let () =
  print_endline "The Start";
  my_getcwd () |> begin function
  | Success folder -> Printf.printf "getcwd:\n\t%s\n" folder
  | Error errMessage -> Printf.printf "getcwd (error):\n\t%s\n" errMessage
  end;
  print_endline "The End." ;
  flush stdout

或者,不使用;

代码语言:javascript
复制
let () =
  let () = print_endline "The Start" in
  let () = match my_getcwd () with
    | Success folder -> Printf.printf "getcwd:\n\t%s\n" folder
    | Error errMessage -> Printf.printf "getcwd (error):\n\t%s\n" errMessage
  in
  let () = print_endline "The End." in
  flush stdout
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24757501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档