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