[英]OCaml's set_signal's equivalent in F#
我搜索了一下,找不到任何东西。 我正在将OCaml国际象棋程序 “转换”为F#,既是了解Chess表示如何工作的工具,又是内部化(可以这么说)F#进行非OO的方式的工具。
这些代码让我很沮丧
set_signal sigint (Signal_handle (fun _ -> raise Interrupt));
和
set_signal sigint Signal_ignore;
中断是前面定义的异常。 现在,我查找了set_signal
功能( 在此处 ),但是我无法确切地知道其目的是什么,或者sigint
没有定义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)
那是关于名称空间的不好的事情,很难知道事物的来源。
因此,首先,在Sys
模块中定义sigint
:
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#中实现它很容易,不是吗? ;-)
例如,您可以查看此代码(同时查看OCaml和F#代码)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.