2016-06-09 15 views
3

Ich suchte ein wenig und konnte nichts finden. Ich übersetze ein OCaml chess program in F #, beides als ein Werkzeug, um zu verstehen, wie eine Chess - Repräsentation funktionieren würde, und um sozusagen F # 's zu verinnerlichen, Dinge zu tun, die nicht OO sind.OCamls set_signal entspricht in F #

Diese Teile des Codes mich sind stumping

set_signal sigint (Signal_handle (fun _ -> raise Interrupt)); 

und

set_signal sigint Signal_ignore; 

Interrupt ist eine Ausnahme früher definiert. Jetzt habe ich nachgeschlagen, was set_signal tut (here), aber ich kann nicht genau herausfinden, was ist der Zweck hier, oder wie sigint überhaupt definiert ist. Wie kann ich dieses Verhalten in F # replizieren oder nachahmen?

Wenn Sie es im Kontext sehen möchten, ist es um Zeile 532 in der OCaml-Quelle. Dies ist die fragliche Methode:

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

Das Signal Sachen ein Unixism ist. Für Ihren Port müssen Sie eine weniger spezifische Lösung für dasselbe Problem finden. Wie Sie unten selbst kommentiert haben, verwendet Winboard auch einen anderen Ansatz. Wenn Sie das Xboard-Protokoll mit UCI vergleichen, werden Sie feststellen, dass die UI in UCI davon ausgeht, dass die Befehlsverarbeitung parallel zur Suche der Engine läuft. UCI-Engines überprüfen typischerweise einige (veränderbare, böse) Flags, um zu sehen, ob sie die Suche beenden sollten. Sie könnten darüber nachdenken, dies auch hier zu tun. – BitTickler

Antwort

4

Das ist das Schlechte an Namespaces, es ist schwer zu wissen, woher die Dinge kommen.

So zu starten, sigint ist im Sys Modul definiert:

val sigint : int 

    Interactive interrupt (ctrl-C) 

Also, was

set_signal sigint (Signal_handle (fun _ -> raise Interrupt)); 

und

set_signal sigint Signal_ignore; 

tun?

Sie nur an dem System sagen (set_signal zu dem System kommunizieren, welches Verhalten sie auf einem bestimmtes Signal haben sollen), dass, wenn es ein ctrl-C fängt, im ersten Fall es Interrupt und im zweiten Fall erhöhen wird wird es nichts tun .

Nun, da Sie ein besseres Verständnis davon haben, was es bedeutet, denke ich, es ist einfach, es in F # zu implementieren, nein? ;-)

Sie bei this, zum Beispiel aussehen könnte (siehe beiden OCaml und F # Codes)

+0

Danke für den Link, der eigentlich ein gutes Stück erklärt. Ich habe tatsächlich die Dokumentation für Xboard (die GUI-Software, mit der die App interagiert) nachgeschlagen und verwendet diese Cancel-Signale, um eine Engine zu zwingen, sich sofort zu bewegen. Allerdings hat Winboard (der Win32-Port) sie anscheinend nicht, also muss ich mich überhaupt nicht mit ihnen befassen. – asibahi