簡體   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