2016-06-09 1 views
3

Я искал это немного и ничего не нашел. Я «переводил» 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) 
+0

Вещество сигнал является Unixism. Для вашего порта вам нужно придумать менее конкретное решение этой проблемы. Как вы прокомментировали ниже, Winboard также использует другой подход. Кроме того, если вы сравниваете протокол xboard с UCI, вы заметите, что в UCI пользовательский интерфейс предполагает, что обработка команд выполняется параллельно с поиском движка. Двигатели UCI обычно проверяют некоторый (изменчивый, противный) флаг, чтобы проверить, не должны ли они быть спасены от поиска. Вы могли бы подумать об этом здесь. – BitTickler

ответ

4

Это плохо, что касается пространств имен, трудно понять, откуда взялись вещи.

Итак, для начала, 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 # кодов)

+0

Спасибо за ссылку, что на самом деле объясняет честный бит. Я фактически просмотрел документацию для Xboard (приложение GUI, с которым приложение взаимодействует), и оно использует эти сигналы отмены, чтобы заставить движок немедленно двигаться. Однако очевидно, что у Winboard (порт Win32) их нет, поэтому мне вообще не нужно их беспокоить. – asibahi

 Смежные вопросы

  • Нет связанных вопросов^_^