开发者

How to print a block of data in Ocaml?

I would like to print some rectangles one by one in a terminal like that:

  4 5             7 8
2               5 
3    : bool     6    : int

Which represents that, given an array a, the zone from a([2,3], [4,5]) is bool and the zone from a([5,6], [7,8]) is int.

So the key is to print a block of data in several rows, instead of 1 row as default. Does anyone know how to realize that in Ocaml?

Thank开发者_JS百科 you very much!


Basically, there are two approaches possible:

  1. accumulate your two-dimensional output and use a specialized print function which rearranges the strings in a way you wish
  2. print to a medium with 2D capabilities like terminal or GUI element (to play with terminal screen, one can use a binding to ncurses)

The first approach is more universal and remains functional in spirit. For example:

let item1 =
["  4 5          "
;"2              "
;"3    : bool    "
]

let item2 =
["  7 8          "
;"5              "
;"6    : int     "
]

let transpose ll =
  let rec pick_one ll =
    match ll with
      | [] -> []
      | [] :: _ -> []
      | _ ->
      let tear (reaped, rest) l =
        match l with
          | [] -> assert false
          | hd :: tl -> (hd :: reaped, tl :: rest)
       in
      let (reaped, rest) = List.fold_left tear ([], []) ll in
      (reaped :: (pick_one rest))
   in
  pick_one ll

let multiline_print items =
  let by_lines = transpose items in
  let show_line line = List.iter print_string line; print_endline "" in
  List.iter show_line by_lines

let _ = multiline_print [item1; item2]

Depending on your needs, you may build printf-like functionality around this. You need to route through a "layout engine" the strings produced by the functions in your new Printf-like module.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜