Я искал это немного и ничего не нашел. Я «переводил» OCaml chess program в F #, как инструмент для понимания того, как будет работать представление в шахматах, так и для того, чтобы интернализировать, так сказать, способ F # делать вещи, которые не являются OO.эквивалент set_signal OCaml в F #
Эти куски кода топала мне
set_signal sigint (Signal_handle (fun _ -> raise Interrupt));
и
set_signal sigint Signal_ignore;
Прерывание является исключение определено ранее. Теперь я посмотрел, что делает set_signal
(here), но я не могу точно определить, в чем его цель, или как вообще определяется sigint
. Как я могу воспроизвести или подражать этому поведению в F #.
Если вы хотите увидеть его в контексте, он находится вокруг строки 532 в источнике OCaml. Это метод, о котором идет речь:
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)
Вещество сигнал является Unixism. Для вашего порта вам нужно придумать менее конкретное решение этой проблемы. Как вы прокомментировали ниже, Winboard также использует другой подход. Кроме того, если вы сравниваете протокол xboard с UCI, вы заметите, что в UCI пользовательский интерфейс предполагает, что обработка команд выполняется параллельно с поиском движка. Двигатели UCI обычно проверяют некоторый (изменчивый, противный) флаг, чтобы проверить, не должны ли они быть спасены от поиска. Вы могли бы подумать об этом здесь. – BitTickler