Синтаксическая ошибка: ожидается оператор (закрывающая скобка не обрабатывается) - PullRequest
0 голосов
/ 26 мая 2020

У меня эта ошибка появляется, когда я пытался протестировать свои функции, может ли кто-нибудь знать, откуда эта ошибка?

   let () =
            let t = Sys.time() in
            let args_n = Array.length Sys.argv - 1 in
            let args_list = Array.to_list (Array.sub Sys.argv 1 args_n) in
            List.iter (fun element ->
            let length_of_element = String.length element in
            let text = check_if_file(List.nth args_list 1) in
            let int_ls = search (to_list_ch element) text length_of_element) (check_if_file(List.nth args_list 0 )) in
            if (List.length int_ls)> 1 then print_string "pattern found at characters "
            else if (List.length int_ls) = 1 then print_string "Pattern found at character "
            else print_string "No patterns found."
            ;
            print_ls int_ls;
            Printf.printf "Execution time: %fs\n" (Sys.time() -. t);;

Ocaml сообщает, что она возникла из закрывающей скобки после length_of_element, но вещи - если я удалю его, открывающая скобка в строке List.iter не будет иметь никакой закрывающей скобки, соответствующей ему. это:

let () =
        let t = Sys.time() in
        let args_n = Array.length Sys.argv - 1 in
        let args_list = Array.to_list (Array.sub Sys.argv 1 args_n) in
        let pattern =check_if_file(List.nth args_list 0 )in
        let lpattern = String.length pattern - 1 in
        let text = check_if_file(List.nth args_list 1) in
        let int_ls = search (to_list_ch pattern) text lpattern in
        if (List.length int_ls)> 1 then print_string "pattern found at characters "
        else if (List.length int_ls) = 1 then print_string "Pattern found at character "
        else print_string "No patterns found."
        ;
        print_ls int_ls;
        Printf.printf "Execution time: %fs\n" (Sys.time() -. t);;

Но он работал только для одной строки, а не для нескольких строк, поэтому я tr ie перебирать в списке, чтобы он работал не только для одной строки, а для списка строк

1 Ответ

1 голос
/ 26 мая 2020

Конструкция let x = e1 in e2 вычисляет e1, а затем делает свой результат доступным в e2. В вашем случае у вас нет in e2, поэтому нет особого смысла иметь let x =.

То, что вы написали, - это List.iter (fun -> ... let x = e1) in e2. Но что вы ожидаете от x внутри e2? Должен ли он быть результатом первой оценки e1 в l oop? Последний? Что, если тело l oop никогда не выполняется, потому что список, который вы перебираете, пуст? Я предлагаю сделать шаг назад и немного подумать о том, что вы на самом деле пытаетесь вычислить.

...