2011-07-18 12 views
1

Iは、いくつかの長方形にそのような端末に一つずつ印刷したい:配列a与え、a([2,3], [4,5])からゾーンがboola([5,6], [7,8])からゾーンがintである、ことを表しOcamlでデータブロックを印刷するには?

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

を。

したがって、キーは、デフォルトで1行ではなく、複数の行にデータブロックを印刷することです。誰もがOcamlでそれを実現する方法を知っていますか?

ありがとうございました!

+1

あなたの質問は全く明確ではありません。書きたい機能の入力と出力の例を挙げることができますか?そしてあなたがそれにしたいタイプは何ですか? – Surikator

答えて

1

は基本的には、可能な2つのアプローチがあります

  1. はあなたの二次元の出力を蓄積し、あなたのような2D機能を持つメディアへ
  2. 印刷を希望する方法で文字列を並べ替えて、特殊な印刷機能を使用します(端末画面で再生するには、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のようなモジュールの関数で生成された文字列を、 "レイアウトエンジン"を通してルーティングする必要があります。

関連する問題