OCaml 的 set_signal 在 F# 中的等价物
OCaml's set_signal's equivalent in F#
我搜索了一下,没有找到任何东西。我 "translating" 是 F# 的 OCaml chess program ,既可以作为一种工具来理解国际象棋表示的工作方式,也可以说是内化 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)
这就是命名空间的坏处,很难知道它们从何而来。
因此,首先,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
时,在第一种情况下它会引发 Interrupt
在第二种情况下它什么都不做。
既然您已经更好地理解了它的含义,我认为在 F# 中实现它很容易,不是吗? ;-)
例如,您可以查看 this(同时查看 OCaml 和 F# 代码)
我搜索了一下,没有找到任何东西。我 "translating" 是 F# 的 OCaml chess program ,既可以作为一种工具来理解国际象棋表示的工作方式,也可以说是内化 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)
这就是命名空间的坏处,很难知道它们从何而来。
因此,首先,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
时,在第一种情况下它会引发 Interrupt
在第二种情况下它什么都不做。
既然您已经更好地理解了它的含义,我认为在 F# 中实现它很容易,不是吗? ;-)
例如,您可以查看 this(同时查看 OCaml 和 F# 代码)