Menu

Zero while 루프: 에이전트 우선 언어의 반복문

Zero에서 지금 while 루프가 어떻게 동작하는지 정리했습니다. 조건, 루프 본문, 초기 단계에 fordo-while이 빠진 이유, 그리고 루프와 명시적 효과가 어떻게 맞물리는지 살펴봅니다.

이 페이지에는 실행 가능한 에디터가 있습니다 — 편집하고 실행하면 결과를 바로 볼 수 있습니다.

기본

whilebool 조건이 true인 동안 본문을 실행합니다.

while condition {
    // 본문
}

컴파일러는 반복마다 조건을 먼저 평가합니다.

  • true — 본문 실행 후 다시 검사.
  • false — 루프 종료.

Zero 예제에 나오는 사소한 예시로, 시작부터 false인 조건입니다.

실행해 보면 두 번째 write만 실행됩니다. 처음 검사할 때 조건이 false였기 때문에 while 본문은 한 번도 실행되지 않아요.

조건은 bool

if/else와 마찬가지로 루프 조건도 bool이어야 합니다. Zero는 정수, 문자열, 그 외 값을 불리언으로 강제 변환하지 않습니다.

while count {              // 컴파일 에러
    // ...
}

while count > 0 {          // OK
    // ...
}

조건은 bool로 평가되는 어떤 것이든 가능합니다. 바인딩, 비교, &&/|| 결합, 함수 호출 등. if에 적용되는 규칙이 그대로 적용됩니다.

카운트 루프

"무언가를 N번 수행"이라는 고전적인 패턴은 카운터와 while을 씁니다.

let mut i = 0
while i < 10 {
    // 작업
    i = i + 1
}

세 부분: 초깃값, 경계와 비교하는 조건, 본문 안의 갱신. 모든 명령형 언어가 가진 패턴이고, Zero는 그저 for 키워드로 포장하지 않을 뿐입니다.

위에서 쓴 mut 표기에 관한 메모: 가변 바인딩 표기가 1.0 이전 버전 사이에서 다를 수 있습니다. 컴파일러가 받아들이는 정확한 문법은 작은 테스트에 zero check --json을 돌려 확인하세요. 카운터 + 조건 + 갱신이라는 개념적인 패턴은 안정적인 부분입니다.

무한 루프

조건이 항상 truewhile은 영원히 돕니다.

while true {
    // 작업을 기다리고, 처리하고, 다시 반복
}

이벤트 루프, REPL, 장시간 돌아가는 서버에 어울리는 모양입니다. 빠져나오려면 프로세스를 종료하거나, 본문에서 에러를 발생시키거나, 조건을 깨도록 구조를 바꿉니다.

루프를 언제 쓸지

루프는 아껴 쓰는 도구입니다. 다른 언어에서 루프처럼 보이는 것들이 Zero에서는 더 깔끔한 모양을 갖는 경우가 많습니다.

  • 고정된 컬렉션 순회: 표준 라이브러리나 자신의 shape가 노출하는 함수를 사용하세요. forEach 스타일 도우미, 폴더, 재귀적 순회 같은 것들요.
  • 입력의 끝까지 읽기: 실패할 수 있는 읽기 위에서 루프를 돌되, 상태 플래그를 중첩하기보다 checkraises로 경계를 깔끔히 처리하세요.
  • 조건 폴링: 설계가 신호를 건네받는 방식을 취해야 하지 않는지 살펴보세요. 폴링 루프는 어느 시스템 언어에서나 코드 냄새입니다.

같은 본능이 에이전트에게도 적용됩니다. 타이트하고 선언적인 모양은 사람과 코드 생성기 모두에게 추론하기 쉽습니다. 손으로 짜는 카운터 루프보다 말이죠.

루프와 효과

다른 블록처럼 while 본문도 I/O를 할 수 있습니다 — 단, World 능력 (또는 그 일부)에 접근할 수 있을 때에 한해서요. 시그니처에 World가 없는 함수는 마음껏 루프를 돌 수 있지만 바깥에 무언가를 쓸 수는 없습니다. 이 속성은 루프 본문 안에서도 유지됩니다. 루프가 새로운 능력을 부여하지는 않거든요.

당연해 보이지만, "순수한" 계산 함수 안에 while을 두고도 시그니처만으로 어떤 출력도 디스크 쓰기도 할 수 없다는 사실을 알 수 있는 이유가 바로 이겁니다.

스타일 노트

작지만 보상이 큰 몇 가지 습관입니다.

  • 조건을 분명하게 유지하세요. 조건이 진짜 일을 하고 있다면 명명된 함수나 바인딩으로 빼서 루프가 깔끔하게 읽히도록 하세요.
  • 카운터 갱신은 본문 흩어진 곳이 아니라 본문 끝에서 하세요. 오프바이원 버그를 발견하기 쉬워집니다.
  • 도중에 뒤집히는 플래그보다는, 루프 자체의 조건으로 표현 가능한 조기 종료 조건을 선호하세요. 움직이는 부품이 줄어듭니다.

다음 글: shape

이제 Zero의 핵심 제어 흐름을 모두 봤습니다. 다음 챕터는 데이터 모델링이에요. 시작은 shape — Zero의 구조체 같은 곱타입입니다.

자주 묻는 질문

Zero의 while 루프는 어떻게 동작하나요?

while 조건 { ... }으로 씁니다. 조건은 반복마다 먼저 평가되며, true면 본문이 실행되고 다시 검사합니다. false면 루프를 빠져나와 닫는 중괄호 다음으로 진행해요. 조건은 bool이어야 합니다.

Zero에 for 루프가 있나요?

초기 Zero는 while을 유일한 루프 구조로 제공합니다. 안정화되는 동안 표면적을 의도적으로 작게 유지하기 위함이에요. 키워드가 적을수록 에이전트가 잘못된 형태를 고를 일이 줄어듭니다. 범위나 컬렉션 위에서 도는 for는 나중에 추가될 수 있고, 그때까지는 while과 카운터로 같은 패턴을 만듭니다.

Zero에서 카운트 루프는 어떻게 작성하나요?

카운터를 초기화하고, 그에 대해 while을 돌리고, 본문 안에서 갱신합니다: let mut i = 0; while i < 10 { ...; i = i + 1 }. 1.0 이전 Zero에서 가변성 문법은 아직 발전 중이라 정확한 표기는 최신 문서를 확인하세요. 다만 while + 카운터 + 갱신 패턴 자체는 표준적인 카운트 루프 관용구입니다.

Zero에 break나 continue가 있나요?

Zero 계열의 대부분 언어는 루프용 조기 종료 구조를 제공합니다. 1.0 이전 Zero에서 정확한 표기는 1.0 전에 바뀔 수 있는 영역 중 하나예요. 보수적인 접근은 조건 자체가 그 일을 하도록 루프를 구성하는 것입니다. 특정 제어 흐름 키워드에 의존하지 말고, 조건을 뒤집고 갱신해서 루프가 자연스럽게 빠져나오게 만드세요.

Zero의 while 루프가 영원히 돌 수도 있나요?

네 — while true { ... }는 무한 루프입니다. 서버, 이벤트 루프, REPL처럼 자연스러운 종료 조건이 없는 곳에 유용합니다. 암묵적 참/거짓과 달리, 여기서 truebool 타입의 리터럴이므로 조건은 여전히 타입이 맞습니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기