Core.Command.run在v0.14至v0.15间API变更?求替代方案
Core v0.15 中 Core.Command.run 废弃后的替代方案
问题场景
以下代码在Core v0.14(OCaml 4.10)环境可正常编译,但在Core v0.15(OCaml 4.11)中编译失败:
open Core;; let command = Command.basic ~summary:"essai" ( let open Command.Let_syntax in let%map_open s = anon(sequence ("n" %: int)) in fun () -> List.iter s ~f:(fun x -> Printf.printf "n = %d\n" x ) ; ) let () = Command.run ~version:"0.0" ~build_info:"RWO" command;;
编译报错信息
File "cli.ml", line 10, characters 9-20: 10 | let () = Command.run ~version:"0.0" ~build_info:"RWO" command;; ^^^^^^^^^^^ Error (alert deprecated): Core.Command.run [since 2021-03] Use [Command_unix] File "cli.ml", line 10, characters 9-20: 10 | let () = Command.run ~version:"0.0" ~build_info:"RWO" command;; ^^^^^^^^^^^ Error: This expression has type [ `Use_Command_unix ] This is not a function; it cannot be applied.
解决方案
Core v0.15 开始将 Unix 相关的命令行运行功能拆分到了 Command_unix 模块,原 Core.Command.run 已被废弃(不再是可调用的函数,仅作为提示标识存在)。只需做两处修改:
- 打开
Core_unix模块(或在保留open Core的同时额外打开Command_unix) - 将
Command.run替换为Command_unix.run
修改后的完整代码:
open Core_unix;; let command = Command.basic ~summary:"essai" ( let open Command.Let_syntax in let%map_open s = anon(sequence ("n" %: int)) in fun () -> List.iter s ~f:(fun x -> Printf.printf "n = %d\n" x ) ; ) let () = Command_unix.run ~version:"0.0" ~build_info:"RWO" command;;
若需保留 open Core,也可以这样写:
open Core;; open Command_unix;; let command = Command.basic ~summary:"essai" ( let open Command.Let_syntax in let%map_open s = anon(sequence ("n" %: int)) in fun () -> List.iter s ~f:(fun x -> Printf.printf "n = %d\n" x ) ; ) let () = run ~version:"0.0" ~build_info:"RWO" command;;
内容的提问来源于stack exchange,提问作者Pierre G.
相关产品推荐
相关产品推荐

