練習問題 10.1

プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~のp.215より。

UNIXの cat コマンドは,ファイル名の列を引数として,その内容を順次表示する(標準出力 に書き込む)ものです。これを OCaml で実装し,実行可能ファイルを作成しなさい。オプシ ョンに関しては少なくとも行番号を表示するための -n オプションを実装すること。

 let version = "0.1"
 
 let display_linenum = ref false
 
 let filenames = ref []
 
 let spec = [("-n",
              Arg.Set display_linenum,
              "Display line number.");
             ("-version",
              Arg.Unit (fun () -> Printf.printf "cat in OCaml ver.%s\n" version),
              "Display version.")]
 
 
 (* print each lines *)
 let rec output_file ic =
   print_endline (input_line ic);
   output_file ic
 
 (* print each lines with line number *)
 let rec output_file_n n ic =
   Printf.printf "%5d %s\n" n (input_line ic);
   output_file_n (n+1) ic
 
 let cat_file filename =
   let infile = open_in filename in
   try
     if !display_linenum then
       output_file_n 1 infile
     else
       output_file infile;
   with
     End_of_file -> close_in infile
 
 
 let () =
   Arg.parse spec
             (fun s -> filenames := s :: !filenames)
             "Usage: cat [-n] [-help] [-version] filename ...";
   List.iter cat_file (List.rev !filenames)
 ^o^ >ocamlc -o cat.exe cat.ml
 
 ^o^ >cat -n cat.ml
     1 let version = "0.1"
     2
     3 let display_linenum = ref false
     4
     5 let filenames = ref []
     6
     7 let spec = [("-n",
     8              Arg.Set display_linenum,
     9              "Display line number.");
    10             ("-version",
    11              Arg.Unit (fun () -> Printf.printf "cat in OCaml ver.%s\n" ve
 sion),
    12              "Display version.")]
    13
 
 (以下略)