我搜索了一下,找不到任何东西。我正在将一个OCaml chess program“翻译”为F#,它们都是理解Chess表示如何工作和内化的工具,也就是说,F#的做事方式不是OO。OCaml的set_signal等效于F#
这些作品的代码被绊倒我
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)
信号的东西是Unixism。对于您的端口,您需要针对相同的问题提出不太具体的解决方案。正如你自己在下面评论的那样,Winboard也使用另一种方法。另外,如果您将xboard协议与UCI进行比较,您会注意到在UCI中,UI假定命令处理与搜索引擎并行运行。 UCI引擎通常会检查一些(可变的,令人讨厌的)标志,看看他们是否应该退出搜索。你可以考虑在这里做同样的事情。 – BitTickler