Lua 5.4에서 코루틴을 만든다고 디자인이 시작되지는 않아요. 호스트가 coroutine.resume을 불러야 생성기가 돌기 시작하고, 제안을 명시적으로 yield하는 지점까지 가요. 한 번에 타일 하나씩이에요.
빨간 타일 하나는 이미 받아들여졌어요. 생성기가 옆 칸에 놓을 파란 사각형을 yield해요. 여기서 제어가 넘어가요. 사용자가 그걸 거절하고 호박색을 달라고 해요. 호스트는 멈춰 있던 코루틴을 그 결정과 함께 재개하고, 생성기는 coroutine.yield 호출이 돌려준 값에서 결정을 읽어요. 그리고 다음 제안을 준비해요.
거절이 바꾸는 건 뭘까요? 팔레트 위치를 앞으로 보낼 수도, 그대로 둘 수도, 제안 전 상태로 되돌릴 수도 있어요. 고르는 데 따라 작가가 고쳐 나가는 방식이 달라져요. 거절된 제안과 그 결정을 보이게 남겨 두면 다음 타일이 왜 다른지 설명이 돼요.
사용자가 그만두면 호스트는 재개를 멈추면 돼요. 코루틴은 끝난 게 아니라 멈춘 채로 남으니까, 아직 붙잡고 있는 상태와 자원을 어떻게 할지 애플리케이션이 정해야 해요.
Lua 코루틴은 OS 스레드가 아니에요. 제안, 판단, 이어 가기가 각자 자기 순간을 가져요. 이렇게 드러난 넘김 덕분에 수정 과정이 읽히지만, 넘길 때마다 무엇이 살아남는지는 분명해야 해요.
