Каким должен быть терминатор строки здесь - PullRequest
1 голос
/ 05 мая 2019

Я пишу короткий сценарий для чтения каждого файла в папке файлов сценария и печати последнего слова в первой строке - с указанием исполняемого файла, который запускается - ocaml, например. в usr/bin/ocaml

#use "topfind" 
#require "str"

(* fn to print binary file being called from hashbang line of script file *)
let rec myfn (afile) = 
    print_string (afile^": ");
    if (Sys.is_directory afile) then print_endline("This is a directory.");
    let ic = (open_in afile) in
    if in_channel_length(ic)==0 then print_endline("Zero length file."); exit 0
    let line = input_line(ic) in    (* error here *)
    if (Str.first_chars line 0 = "#") then
        let linelist = (Str.split (Str.regexp "/") line) in    
        let lastword = List.nth linelist ((List.length linelist) - 1) in 
        print_endline(lastword)
    else
        print_endline("Not a script file.") ;; 

(* to check all files in directory *)
let dir = "." in 
let files = Sys.readdir dir in 
Array.iter myfn files;; 

Однако выдается следующая ошибка:

File "firstline3.ml", line 13, characters 27-29:
Error: Syntax error

Я попытался заменить in на ; или не использовать терминатор в этой строке, но это не помогает. В чем проблема и как ее можно решить. Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 05 мая 2019

Вы пропускаете скобки вокруг выражения then:

if in_channel_length ic =0 then ( print_endline "Zero length file."; exit 0 );

в противном случае выражение читается синтаксическим анализатором как

(if in_channel_length ic = 0 then print_endline "Zero length file.");
exit 0;

и выход, таким образом, безоговорочный.

Обратите внимание, вам следует избегать оператора физического равенства == (особенно для неизменяемых значений) и использовать вместо него =.

РЕДАКТИРОВАТЬ: Если вы хотите вернуться, вам просто нужно добавить еще ветку

if in_channel_length ic = 0 then print_endline "Zero length file."
else ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...