전역은 정적 저장소다. 초기값이 컴파일타임 상수면 이미지에 박고 아니면 0이다. 문자열 리터럴은 바이트를 이미지에 두고 포인터와 길이를 값으로 만든다. 같은 글자는 같은 저장소를 쓴다 -- 읽기 전용이라 공유가 공짜다. defers 프로그램이 defer 순서를 실행으로 고정한다. 등록 역순이고, 이른 return 과 끝까지 간 경로 양쪽 다 돈다.
23 lines
403 B
Plaintext
23 lines
403 B
Plaintext
// EXIT:21921
|
|
// body(true): defer 2 then defer 1 -> 2, 21
|
|
// body(false): note(9) first -> 219, 2192, 21921
|
|
unit defers;
|
|
|
|
var log: i32 = 0;
|
|
|
|
fn note(v: i32) -> void { log = log * 10 + v; }
|
|
|
|
fn body(early: bool) -> i32 {
|
|
defer { note(1); }
|
|
defer { note(2); }
|
|
if early { return 0; }
|
|
note(9);
|
|
return 0;
|
|
}
|
|
|
|
fn main() -> i32 {
|
|
body(true);
|
|
body(false);
|
|
return log;
|
|
}
|