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