Как распечатать блок данных в Ocaml? - PullRequest
1 голос
/ 18 июля 2011

Я хотел бы напечатать несколько прямоугольников один за другим в терминале следующим образом:

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

Что означает, что для массива a зона от a([2,3], [4,5]) равна bool, а зона от a([5,6], [7,8]) равна int.

Таким образом, ключом является печать блока данных в несколько строк вместо 1 строки по умолчанию. Кто-нибудь знает, как это реализовать в Окамле?

Большое спасибо!

1 Ответ

1 голос
/ 13 декабря 2011

В принципе, возможны два подхода:

  1. накапливает ваш двумерный вывод и использует специальную функцию печати, которая перестраивает строки так, как вы хотите
  2. печать на носителе с возможностями 2D, такими как терминал или элемент графического интерфейса (для воспроизведения с экраном терминала можно использовать привязку к ncurses )

Первый подход более универсален и остается функциональным по духу. Например:

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]

В зависимости от ваших потребностей, вы можете создать printf -подобную функциональность вокруг этого. Вам необходимо направить через «механизм компоновки» строки, созданные функциями в вашем новом Printf -подобном модуле.

...