2014-10-09 2 views
1

다음 코드에서 Proc.num_stack_slots.(i) <- 0의 끝에 세미콜론이 오는 이유는 무엇입니까? OCaml에서 세미콜론이 분리 기호라고 생각했습니다. 블록의 마지막 표현을 위해 선택적인 세미콜론을 넣을 수 있습니까?for 루프에서 OCaml 세미콜론 단일 표현식

for i = 0 to Proc.num_register_classes - 1 do 
    Proc.num_stack_slots.(i) <- 0; 
done; 

전체 예제는 https://github.com/def-lkb/ocaml-tyr/blob/master/asmcomp/coloring.ml 라인 273을 참조하십시오.

답변

7

이 식 뒤에 세미콜론이 필요하지 않지만 구문법에 따라 여기에 허용됩니다. 이 예제에서 세미콜론 (semicolumn)이있다.

기본적으로 세미콜론은 2 개의 단위 표현식을 사용하여 왼쪽에서 오른쪽으로 실행하고 단위를 반환하는 2 진수 연산자로 볼 수 있습니다.

val (;): unit -> unit -> unit 

다음 예는 더 이해할 수있을 것입니다 :

for i = 1 to 5 do 
    printf "Hello, "; 
    printf "world\n" 
done 

여기 ; 작품을 단지 접착제. 두 번째 식 뒤에는 ;을 넣을 수 있지만 구문 설탕으로 만 사용할 수 있습니다. 컴파일러 개발자는 예의를 갖추지 않습니다.

seq_expr: 
    | expr  %prec below_SEMI { $1 } 
    | expr SEMI      { reloc_exp $1 } 
    | expr SEMI seq_expr   { mkexp(Pexp_sequence($1, $3)) } 

당신도 같은 이상한 코드를 작성할 수 있다는 것을 의미하십시오 seq_expr 내부 표현이 semicolumn에 의해 종료 될 수 있음을

당신이 보게 될 OCaml의 컴파일러의 파서 정의를 열 경우 :

let x = 2 in x; let y = 3 in y; 25 
+0

마지막 예는 경고없이 컴파일되지 않지만 (경고 10 :이 표현식에는 단위가 있어야합니다.) 시퀀스의 각 표현식 (마지막 표현식 제외)은 단위 유형이어야합니다. –

+0

그것은 컴파일합니다. 경고 만하는 것은 당신이 뭔가 잘못하고 있다는 것입니다. 컴파일러는 이것에 대해 사실입니다. 의미 상으로 말도 안되기 때문입니다. 나는 당신에게 구문 기능을 보여줄뿐입니다. semicolumn을 사용하면 구문 적으로 표현식을 구분할 수 있지만 단위 유형이없는 경우 경고가 표시됩니다. – ivg

+0

예 알아요. 방금 당신의 대답에 언급 할 가치가 있다고 생각했습니다. –