【问题标题】:OCaml's set_signal's equivalent in F#F# 中 OCaml 的 set_signal 等效项
【发布时间】:2016-06-09 23:34:24
【问题描述】:

我搜索了一下,找不到任何东西。我正在将OCaml chess program“翻译”为 F#,既可以作为了解国际象棋表示如何工作的工具,也可以将 F# 的非 OO 做事方式内化。

这些代码让我很难过

set_signal sigint (Signal_handle (fun _ -> raise Interrupt));

set_signal sigint Signal_ignore;

中断是前面定义的异常。现在我查看了set_signal 的作用(here),但我无法弄清楚它在这里的目的是什么,或者根本不知道sigint 是如何定义的。如何在 F# 中复制或模仿这种行为。

如果您想在上下文中查看它,它位于 OCaml 源代码中的第 532 行附近。这是有问题的方法:

let alpha_beta_deepening pos interval = 
    del_timer ();
    let current_best = ref (alpha_beta_search pos 2) in (* alpha_beta_seach _ 2   can only return legal moves *)
    ((try 
        set_signal sigint (Signal_handle (fun _ -> raise Interrupt));
        set_timer interval;
        let rec loop i = 
            if i > max_depth then () else
            let tmp = alpha_beta_search pos i in
            current_best := tmp;
            if (fst tmp) >=  win (* we can checkmate *)
            || (fst tmp) <= -win (* we get checkmated anyway, deny the opponent extra time to think *)
                then () else loop (i+1) 
        in loop 3;
        set_signal sigint Signal_ignore;
        del_timer ();
    with Interrupt -> ());
    set_signal sigint Signal_ignore;
    del_timer ();
    !current_best)

【问题讨论】:

  • 信号是 Unix 主义。对于您的端口,您需要针对同一问题提出一个不太具体的解决方案。正如您在下面自己评论的那样,Winboard 还使用了另一种方法。此外,如果您将 xboard 协议与 UCI 进行比较,您会注意到在 UCI 中,UI 假定命令处理与引擎搜索并行运行。 UCI 引擎通常会检查一些(可变的、讨厌的)标志,以查看它们是否应该退出搜索。你可以考虑在这里做同样的事情。

标签: .net f# ocaml signal-handling


【解决方案1】:

这就是命名空间的坏处,很难知道事情是从哪里来的。

所以,首先,sigintSys 模块中定义:

val sigint : int

  Interactive interrupt (ctrl-C)

那么,什么

 set_signal sigint (Signal_handle (fun _ -> raise Interrupt));

 set_signal sigint Signal_ignore;

做吗?

他们只是对系统说(set_signal 向系统传达他应该对特定信号采取什么行为)当它捕获 ctrl-C 时,在第一种情况下它会引发 Interrupt,在第二种情况下万一它什么也不做。

现在您对它的含义有了更好的理解,我认为在 F# 中实现它很容易,不是吗? ;-)

例如,您可以查看this(查看 OCaml 和 F# 代码)

【讨论】:

  • 感谢您的链接,这实际上解释了一点。我实际上查找了 Xboard 的文档(应用程序与之交互的 GUI 软件),它使用这些取消信号来强制引擎立即移动。但是显然 Winboard(Win32 端口)没有它们,所以我根本不需要打扰它们。
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多