2011-09-11 3 views
7

디버깅/테스트 용 print 문을 코드 블록에 넣을 수 있습니까? 예를 들어, 자바에서는 System.out.println("")을 사용하여 변수 나 다른 것들을 검사 할 수 있지만, OCaml에서는 print_string과 같은 명령을 사용할 수 있습니까? 따라서 단위를 인쇄하는 대신 오류를 발생시키는 단위 유형의 값을 반환하지 않을까요?OCaml Print statements

+0

Ocaml은 Java와 다르므로 원하는대로 인쇄 할 필요가 없습니다. 예를 들어, 목록을 인쇄하려면 작성해야합니다 ... 왜냐하면 ocaml에는 객체 만 있기 때문입니다. –

답변

14

인쇄물을 expression sequence에 삽입하면 문제가 없습니다. 위의 대답이 아니라, 링크와 함께 답변 만 좋은 답변이되지 않으며, 오히려 짧고 때문에

UPDATE 여기

는, 구체적인 예이다. 그것은 계승의 고전 꼬리 재귀 공식이다 (예,하지만 익숙한 지루한) : 여기

# let fac n = 
    let rec f i n acc = 
    if i >= n 
    then acc 
    else (Printf.printf "%8d%8d%8d\n" i n acc; f (i+1) n ((i+1)*acc)) 
    in 
    f 0 n 1;; 
val fac : int -> int = <fun> 
# fac 5;; 
     0  5  1 
     1  5  1 
     2  5  2 
     3  5  6 
     4  5  24 
- : int = 120 

당신이 인쇄의 부작용을 볼 수 있습니다,하지만 결과는 여전히 예상대로 (120)으로 밝혀졌다.

+0

위대한, 정말 고마워! 이것은 내가 찾고 있었던 바로 그 것이었다. 표현식 시퀀스는 일반적으로 다른 용도로 사용 되나요? 아니면 이것의 주요 용도입니까? 변수의 값을 변경하는데도 사용할 수 있다고 생각하십니까? – dxu

+0

예, 상태 값을 업데이트해야하는 것 (예 : 참조 값 업데이트)은 일반적으로이 방법으로 처리됩니다. 이 [여기] (http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora028.html)에 대한 매우 훌륭하고 자세한 설명은 "순서"절을 참조하십시오. –

10

OCaml이 순수한 기능 언어가 아니기 때문에, 이것을 할 수있는 많은 방법이 있습니다. 이런 구체적인 코드를 작성하는 방법은 다음과 같습니다.

let rec mylength list = 
(* DEBUG *) 
let() = Printf.printf "mylength here, null list: %b\n%!" (list = []) 
in 
(* DEBUG *) 
    match list with 
    | [] -> 0 
    | _ :: rest -> 1 + mylength rest 

당신이 (* 디버그 *) 주석 내부의 물건을 제거 할 수 있습니다 작동 후.

%! 버퍼를 플러시한다. printf으로 디버깅을 많이한다면, 이것에 대해 배우는 것은 정말 유용합니다. ignore을 사용

let get_a_string = 
    let a_string = "a string" in 
    (* The semicolon causes the return value of the statement to be discarded *) 
    Printf.printf "Debug: %s\n" a_string; 
    a_string 

let() = Printf.printf "Result: %s\n" get_a_string 

함수의 반환 값을 무시하는 또 다른 방법 :

ignore (Printf.printf "Debug info"); 
다음
+0

'(* DEBUG *) Printf.printf "여기에 널 길이, % list : % b \ n %!"라고 쓰는 것이 더 간단 할 것입니다. (목록 = []); (* DEBUG *) ' – newacct

+1

예. 내가 진정으로 쓰는 방법을 보여주고 있다고 말했듯이. 나는 배움에 남겨진 많은 우선 순위 때문에 괄호 밖에서 세미콜론을 사용하는 것에 대해 수줍음을 느낍니다. –

2

표현 시퀀스 Ray Toal's answer에서 언급 한 바와 같이 반드시 주위에 괄호를 필요로하지 않는다는 것을 보여주는 간단한 예제