2013-12-16 2 views
2

꽤 많은 종류의 예쁜 프린터를 이미 코딩 했으므로 코드의 일부가 예쁜 프린터를 사용하여 값에서 문자열을 가져오고 싶습니다.예쁜 프린터를 사용하여 값에서 문자열 가져 오기

type t = 
    { x: int; 
    y: int } 

let co = { x = 4; y = 5 } 

let print (chan: out_channel) (co: t) : unit = 
    Printf.fprintf chan "(%d, %d)" co.x co.y 

나는 나 문자열 (4, 5)를 얻을하는 데 도움이 될 수 있습니다 기능 Printf.sprintf 생각 :

는 예를 들어, 난 이미 다음과 같은 기능을 구현했습니다. Printf.sprintf "%a" print co을 시도했지만 print : This expression has type out_channel -> t -> unit but an expression was expected of type unit -> 'a -> string 대신 오류가 발생했습니다.

누군가이 줄을 생각 나게하는 방법을 알고 있습니까? 아니면 sprintf 이외의 솔루션을 가진 사람이 있습니까? 나는 분명히 당신이 필요로하는 것을 이해, 그래서 나를 생각하지 않는 것을 두려워

답변

3

, 그것은 바로의 sprintf에 대한 서식 지시자에 %a를 사용하는 것은 불가능합니다 . 당신이 Format 대신 Printf을 사용 감당할 수 경우, 일이 훨씬 쉽게 될 것입니다 : 당신은 OCaml의 4.01를 사용하는 경우, 직접 문서에 따라, 당신이 원하는 않는 것을하는 Format.asprintf

  • .
  • 이전 버전 인 경우 포맷터를 만드는 임시 버퍼를 사용하여이 동작을 쉽게 에뮬레이트 할 수 있습니다. 그런 다음이 포맷터에 쓸 수 있으며 완성되면 버퍼의 내용을 검색하면됩니다.

    let sfprintf fmt = 
        let b = Buffer.create 20 in 
        let return fmt = Format.pp_print_flush fmt(); Buffer.contents b in 
        Format.kfprintf return (Format.formatter_of_buffer b) fmt 
    
        let s = sfprintf "%a" print co 
    

    이 같은 기술은 Printf 포맷 기능에 적용 할 수 있지만, 여기에 또 다른 문제가 있습니다 :

사실, 당신은 당신이 임의의 포맷 기능을 사용할 수 있도록 Format.kfprintf를 사용할 필요가없고 거기는 방법을 사용하여 Buffer.t에서 out_channel을 만듭니다.

내가 내 기능을 원하는 ... 원하는 것을하지
let sfprintf fmt = 
    let (infd,outfd) = Unix.pipe() in 
    let inc = Unix.in_channel_of_descr infd in 
    Unix.set_nonblock infd; 
    let outc = Unix.out_channel_of_descr outfd in 
    let return outc = 
    Printf.fprintf outc "%!"; 
    let b = Buffer.create 10 in 
    try 
     while true do 
     Buffer.add_char b (input_char inc) done; 
     assert false;  
    with Sys_blocked_io -> 
     Unix.close outfd; Unix.close infd; Buffer.contents b 
    in 
    Printf.kfprintf return outc fmt;; 

let s = sfprintf "%a" print co 
0

: 유형 검사 이유로

let prints (co: t) : string = 
    Printf.sprintf "(%d, %d)" co.x co.y 

let print ch co = Printf.fprintf ch "%s" (prints co) 

# print stdout co;; 
(4, 5)- : unit =() 
+0

'... – SoftTimur

+0

I 돈 사용할 수 print' : 내가 생각할 수있는 가장 가까운 방법은 Unix 모듈의 pipe 기능에 의존하는 것입니다 그것이 가능하다고 생각하지 않습니다. 누군가가 당신이 원하는 것을 할 수 있다면 - 나는 정말로 결과를보고 싶다. – Kakadu

관련 문제