繁体   English   中英

F#中的OCaml的set_signal等效项

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM