練習問題 10.1

2008年4月14日
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" version),
   12              "Display version.")]
   13
(以下略)