Бесконечный цикл интерпретации Топеля - PullRequest
0 голосов
/ 04 декабря 2018

Этот код не выведет синтаксическую ошибку, но не завершит компиляцию.Когда я комментирую функцию toutes_reponses, код будет компилироваться и выполняться.toutes_reponses работает в некоем бесконечном цикле интерпретатора?

Я использую ocaml и #use "code.ml" для компиляции.

Кроме того, CPU в это время работает на 100%.

#load "str.cma";;
module Code:
sig
        (** Le type d'un pion *)
        type pion = string

        (** Le type d'un code *)
        type t = pion list

        (** Le nombre de pions par code*)
        val nombre_pion : int          

        (** Le nombre de couleur et symboles possibles*)
        val couleur_possibles : pion list

        (** Compare deux codes
         *  @param code1 premier code a comparer
         *  @param code2 second  code a comparer
         *  @return 0 si les deux codes sont identiques,
                      un entier positif si [code1] est strictement plus grand que [code2]
                      un entier negatif si [code1] est strictement plus petit que [code2]       
         *)
        val compare : t -> t -> int

        (** Conversion chaine de caracteres vers code (pour saisie) 
         *  @param string chaine de caractere saisie
         *  @return le code correspondant a la saisie si la conversion est     possible
                      [None] si la conversion n'est pas possible
         *)
        val string_of_code : t -> string

        (** Conversion chaine de caracteres vers code (pour saisie)
         *  @param string chaine de caractere saisie
         *  @return le code correspondant a la saisie si la conversion est possible
                      [None] si la conversion n'est pas possible
     *)
        val code_of_string : string -> t

        (** La liste de tous les codes permis *)
        val tous : t list

        (** La liste de toutes les reponses possibles *)  
        val toutes_reponses : (int * int) list

        (** Calcule la reponse d'un code par rapport au code cache
         *  @param      code le code propose
         *  @param vrai_code le code cache
         *  @return un couple (nombre de pions bien places, nombre de pions mal places)
            [None] si la reponse ne peut etre calculee
         *)
        val reponse : t -> t -> (int * int)

        val convert : int -> int -> int -> int list -> int list

        val finirTableau : int -> int list -> int list
end = struct    
        type pion = string;;
        type t = pion list;;
        let nombre_pion = 4;;
        let couleur_possibles = ["Rouge"; "Vert"; "Bleu"; "Orange"; "Noir"; "Blanc"];;

        let compare code1 code2 =
          match (code1, code2) with
          | a::b, c::d -> (if a = c then compare b d else
                                  if a > c then 1 else -1)
          | _, _ -> 0;;

        let string_of_code code = List.fold_right (fun x y -> x ^ "_" ^ y) code "";;

        let code_of_string code = List.filter (fun x -> String.length x != 0) (Str.split_delim (Str.regexp "_") code);;

        let rec convert x b i tmp =
          if x = 0 then tmp
          else convert (x / b) b (i + 1) tmp @ [x mod b];;

        let rec finirTableau b tab =
          if (List.length tab) = b then tab
          else finirTableau b (tab @ [0]);;

        let tous =
          let n = List.length couleur_possibles and m = nombre_pion in
          let rec aux i acc =
            if i = -1 then acc else aux (i - 1) acc @ [(List.map (fun x -> (List.nth couleur_possibles x))(finirTableau m (convert i n 0 [])))];
          in aux (int_of_float ((float_of_int n) ** (float_of_int m)) - 1) [];;

        let toutes_reponses =
          let m = nombre_pion in
          let rec aux i acc =
            let array = finirTableau 2 (convert i m 0 []) in
            if i = -1 then acc else aux (i - 1) (acc @ [(List.nth array 0, List.nth array 1)]);
          in aux (nombre_pion * nombre_pion) [];;

        let reponse code secret = (1,2);;
end;;

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Тип toutes_reponses:

toutes_reponses : (int * int) list

Загрузка файла в интерпретатор приводит к оценке всех заявленных терминов, включая этот.И, видимо, вы застряли в его оценке.Если вы хотите иметь возможность загрузить файл в интерпретатор, включите его в приостановленное вычисление,

toutes_reponses : unit -> (int * int) list

let toutes_reponses () = ...
0 голосов
/ 04 декабря 2018

Ваш код прекрасно компилируется, он просто запустил бесконечный цикл в одной из функций до tous.Чтобы устранить эту проблему, вы можете начать с добавления операторов assert для документирования условия ввода для ваших рекурсивных функций.

Обратите также внимание, что в вашем коде много недостатков, которых следует избегать:

  • List.nth (если вам нужен произвольный доступ, структура данных, которую вы должны использовать: _ array)
  • , добавляется в конец списка (например, tab @ [0]).Как правило, список слева от @ должен быть маленьким.
  • вызов List.length внутри рекурсивной функции

Аналогично, если вы хотите разбитьстрока на символе, в стандартной библиотеке String.spilt_on_char (начиная с OCaml ≥4.04).

...