2016-06-09 53 views
3

我搜索了一下,找不到任何东西。我正在将一个OCaml chess program“翻译”为F#,它们都是理解Chess表示如何工作和内化的工具,也就是说,F#的做事方式不是OO。OCaml的set_signal等效于F#

这些作品的代码被绊倒我

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) 
+0

信号的东西是Unixism。对于您的端口,您需要针对相同的问题提出不太具体的解决方案。正如你自己在下面评论的那样,Winboard也使用另一种方法。另外,如果您将xboard协议与UCI进行比较,您会注意到在UCI中,UI假定命令处理与搜索引擎并行运行。 UCI引擎通常会检查一些(可变的,令人讨厌的)标志,看看他们是否应该退出搜索。你可以考虑在这里做同样的事情。 – BitTickler

回答

4

这是命名空间的坏处,很难知道事情来自哪里。

因此,要启动,sigintSys模块中的定义:

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

+0

感谢您的链接,这实际上解释了一点点。我实际上查找了Xboard(应用程序与之交互的GUI软件)的文档,并使用这些取消信号强制引擎立即移动。但显然Winboard(Win32端口)没有它们,所以我不需要打扰他们。 – asibahi