我搜索了一下,找不到任何东西。我正在“翻译”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)
答案 0 :(得分:3)
关于命名空间这是件坏事,很难知道事情的来源。
因此,首先,sigint
模块中定义了Sys
:
val sigint : int
Interactive interrupt (ctrl-C)
那么,
set_signal sigint (Signal_handle (fun _ -> raise Interrupt));
和
set_signal sigint Signal_ignore;
做什么?
他们只是告诉系统(set_signal
向系统传达他应该对特定信号应该采取什么行为)当它捕获ctrl-C
时,在第一种情况下它会引发{{1}在第二种情况下,它什么都不做。
现在您已经更好地了解它的含义,我认为在F#中实现它很容易,不是吗? ; - )
您可以查看this,例如(查看OCaml和F#代码)