OCaml的set_signal在F#中的等价物

时间:2016-06-09 23:34:24

标签: .net f# ocaml signal-handling

我搜索了一下,找不到任何东西。我正在“翻译”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)

1 个答案:

答案 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#代码)