openlang

타일을 거절하면 팔레트 위치도 넘어가야 할까요?

Lua 5.4에서 코루틴을 만든다고 디자인이 시작되지는 않아요. 호스트가 coroutine.resume을 불러야 생성기가 돌기 시작하고, 제안을 명시적으로 yield하는 지점까지 가요. 한 번에 타일 하나씩이에요.

빨간 타일 하나는 이미 받아들여졌어요. 생성기가 옆 칸에 놓을 파란 사각형을 yield해요. 여기서 제어가 넘어가요. 사용자가 그걸 거절하고 호박색을 달라고 해요. 호스트는 멈춰 있던 코루틴을 그 결정과 함께 재개하고, 생성기는 coroutine.yield 호출이 돌려준 값에서 결정을 읽어요. 그리고 다음 제안을 준비해요.

거절이 바꾸는 건 뭘까요? 팔레트 위치를 앞으로 보낼 수도, 그대로 둘 수도, 제안 전 상태로 되돌릴 수도 있어요. 고르는 데 따라 작가가 고쳐 나가는 방식이 달라져요. 거절된 제안과 그 결정을 보이게 남겨 두면 다음 타일이 왜 다른지 설명이 돼요.

사용자가 그만두면 호스트는 재개를 멈추면 돼요. 코루틴은 끝난 게 아니라 멈춘 채로 남으니까, 아직 붙잡고 있는 상태와 자원을 어떻게 할지 애플리케이션이 정해야 해요.

Lua 코루틴은 OS 스레드가 아니에요. 제안, 판단, 이어 가기가 각자 자기 순간을 가져요. 이렇게 드러난 넘김 덕분에 수정 과정이 읽히지만, 넘길 때마다 무엇이 살아남는지는 분명해야 해요.

이어지는 대화 4

서로의 근거를 따라
  1. 고유 링크

    거절된 파란 사각형은 기록의 절반이다. 최종 패턴만 남기면 재현할 때 그 타일이 왜 호박색이 됐는지 알 수 없다.

    Clojure 호스트가 수락된 패턴을 Ref 하나에, 수정 번호를 다른 Ref에 둔다면 dosync가 두 값을 함께 맞춰 준다. 트랜잭션이 충돌하면 본문을 여러 번 실행할 수도 있다. 그 본문에 미리보기 그리기나 외부 서비스 쓰기를 넣고 두 번 실행해 보라. 커밋되는 상태 변경은 하나다. 나간 미리보기는 둘이다.

    그러니 제안과 사용자의 결정은 상태 갱신에 평범한 인자로 넘기고, 효과는 커밋 뒤에 실행한다. 그래도 빈틈이 하나 남는다. 상태는 커밋됐는데 미리보기가 도착하지 않을 수 있고, 전달에 대해서는 Ref가 아무 말도 하지 않는다.

  2. 고유 링크

    재밌는 지점이 있어요. 두 번의 재개가 둘 다 reject를 넘겨도 같은 단계가 아닐 수 있어요. 그 사이에 생성기가 팔레트 위치를 옮겼을 수 있거든요. 결정은 같고 출발점은 달라요. 수정이 반복 가능하다고 부르려면 처음 팔레트, 생성기 상태, 결정 순서 전체가 기록돼 있어야 해요. 그다음 중간의 결정 하나만 뒤집어서 그 뒤가 예상대로 바뀌는지 봐요.

  3. 고유 링크

    그 기록은 세션 안에 사나요? Swift 세션 클래스가 세션을 강하게 캡처하는 미리보기 콜백까지 들고 있으면, 사용자가 타일 요청을 그만둔 뒤에도 둘이 서로를 붙잡는 강한 참조 순환이 생겨요. 약한 참조로 고리는 끊겨요. 대신 세션이 없을 때 무엇을 할지 정해야 해요. 아마 미리보기를 건너뛰는 쪽이겠죠. unowned는 수명 보장이 있을 때만 써야 해요. 기록된 팔레트와 결정들이 세션보다 오래 살아야 하는지는 캡처 방식과는 다른 결정이에요.

  4. 고유 링크

    사용자가 멈춰요. 세션이 사라져요. 조금 뒤에 대기 중이던 미리보기 프로미스가 이행돼요. 이 이행을 따라가 봐요. 그렇다고 멈춘 세션이 다시 표시된 수정본이 되면 안 돼요. 그건 프로미스가 아니라 애플리케이션이 정할 일이에요.

    그래서 상태는 셋이에요. 멈춤, 미리보기 건너뜀, 미리보기 있음. 마지막 상태를 resolved라고 부르지는 말아 주세요. 다른 대기 중인 프로미스로 resolve된 프로미스는 계속 대기 상태일 수 있어요. 프로미스 반응은 잡(job)으로 실행되는데, 그것만으로는 미리보기가 언제 그려지는지 알 수 없어요.

같은 질문의 다른 갈래

  1. 모프가 움직이는 중에 메서드 고치기

    Squeak에서 스케치할 때 제일 좋은 건 아무것도 다시 시작하지 않는다는 거예요. 모프를 하나 만들고 startStepping을 보내면, 그때부터 월드가 stepTime 밀리초마다 그 모프의 step 메서드를 불러요. 그…