rokdocs
v0.1

1.3. 문장 종결자

중요

rok 의 문장은 세미콜론 (;) 으로 끝납니다. 줄바꿈만으로는 문장을 끝낼 수 없습니다.

stmt_terminator ::= ";"

1.3.1. 규칙

문장 종결자에는 몇 가지 단순한 규칙이 있습니다. 먼저 한 문장은 정확히 하나의 ; 로 끝나며, 한 줄에 여러 문장을 함께 둘 수 있습니다. 또한 한 문장이 여러 줄에 걸쳐 있어도 문제가 되지 않는데, 이는 줄바꿈이 토큰 사이의 공백에 지나지 않기 때문입니다.

도식은 다음과 같습니다.

<문장> ;
<문장> ; <문장> ;             // 한 줄에 여러 개
<문장의
 일부가 여러 줄에 걸침> ;    // 여러 줄. 마지막 ; 에서 종료

1.3.2. 줄바꿈 자동 삽입을 두지 않는 이유

rok 은 JavaScript 의 ASI (Automatic Semicolon Insertion), Go 의 줄 끝 자동 세미콜론, Swift 의 줄 단위 종료 같은 자동 규칙을 도입하지 않습니다.

그 이유는 다음과 같습니다. 첫째, 자동 규칙은 드문 경우에서 모호성을 만들어내며, JavaScript 의 ASI 함정이 잘 알려진 예가 됩니다. 둘째, 명시적 종결자가 있어야 포매터, LSP, 에디터의 다음-문장 점프 같은 도구가 문장 경계를 결정론적으로 알 수 있습니다. 마지막으로, 한 줄에 여러 문장을 두는 표기는 REPL 의 빠른 입력 등에서 자연스럽게 사용됩니다.

1.3.3. 빈 문장

; 만 있는 빈 문장도 허용되며, 어떤 효과도 가지지 않습니다.

;;;

위 코드는 세 개의 빈 문장으로 인식됩니다. 도구가 생성한 코드의 자유도를 높이기 위해 이러한 형태를 받아들입니다.

1.3.4. 블록류 식 문장

if, match, loop, while, for, 블록 ({ }, unsafe { }, 라벨 블록) 처럼 } 로 끝나는 블록류 식이 문장 자리에 오면 뒤의 ; 를 생략할 수 있습니다 (Rust 와 같은 규칙). 이때 그 식의 값은 unit 이어야 하며, unit 이 아닌 값을 버리려면 ; 를 붙입니다.

블록 본문 트레일링 클로저 를 가진 호출 (retry(3) { .. }, xs.each |x| { .. }) 도 ; 없이 문장을 끝냅니다 (4.8.8). 이 경우 호출의 값은 ; 를 붙인 것처럼 버려집니다.

if ready { start(); }        // ; 없음
for x in xs { print(x); }
let n = if a { 1 } else { 2 };   // let 문은 여전히 ; 로 끝남

키워드로 시작하는 블록류 식 문장 (if, match 등) 의 } 다음에 이항 연산자가 오면 그것은 새 문장의 시작입니다. 이어서 해석되는 것은 .method() 같은 멤버 접근과 후위 ? 뿐입니다. 트레일링 클로저 호출 뒤의 이항 연산자는 그 호출에 이어서 파싱됩니다.

if c { a(); } else { b(); }
-x;                          // 새 문장 (if 문 - x 가 아님)
match v { ... }.len();       // . 는 이어짐

블록류가 아닌 식이 블록 중간에 문장으로 오면 ; 가 필요합니다. ; 없이 둘 수 있는 것은 블록의 마지막 식 (블록의 값) 뿐입니다.

문법은 블록 표현식 의 stmt 에서 정의합니다.

1.3.5. 다른 토큰과의 결합

; 토큰은 앞뒤 토큰과 공백 없이 붙어 있어도 무방합니다. 예를 들어 <문장>;<문장>; 처럼 빈틈없이 적더라도 두 문장으로 정상적으로 토큰화됩니다. 가독성을 위해 공백을 두는 쪽이 권장 스타일이지만, 사양 자체는 스타일을 강제하지 않습니다.

GitHub에서 이 페이지 고치기