这里的行终止符是什么

时间:2019-05-05 16:02:22

标签: ocaml

我正在编写一个简短的脚本,以读取脚本文件文件夹中的每个文件,并在第一行的最后一行打印最后一个字-指示可执行文件正在运行-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 个答案:

答案 0 :(得分:2)

您在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;

因此退出是无条件的。

请注意,您应避免使用物理等式运算符==(尤其是在非可变值上),而应使用=

编辑:如果要返回,只需添加一个else分支

if in_channel_length ic = 0 then print_endline "Zero length file."
else ....