【发布时间】: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