spec: 완화했던 이동 규칙 둘을 명세에 넣는다
구현만 알고 있으면 둘 중 하나가 틀린 것이다. - 배타 대여를 호출에 넘기는 것은 재대여 -- 이미 §4.2 에 있었다. - 자기 drop 안의 부분 이동은 R7 예외다. 객체가 사라지는 중이라 drop 이 돌아간 뒤에 그 반쪽짜리 값을 읽을 코드가 없다. 다른 함수에는 예외가 없다. TODO 의 '판단을 기다리는 것' 이 비었다.
This commit is contained in:
@@ -54,18 +54,6 @@ uv run python tests/exec.py 31/31 컴파일된 프로그램이 실제로
|
||||
|
||||
---
|
||||
|
||||
## 네 판단을 기다리는 것
|
||||
|
||||
세션 중에 **이동 규칙 두 곳을 완화**했다. R4(참조는 집합 저장소에 못 들어감)는
|
||||
건드리지 않았다.
|
||||
|
||||
| | 무엇 | 왜 | 대안 |
|
||||
|---|---|---|---|
|
||||
| 1 | `&mut T` 를 `&mut T` 파라미터에 넘기는 것은 이동이 아니라 **호출 동안의 재대여** | 없으면 배타 파라미터를 다시 넘기는 일이 함수당 한 번뿐이다. 렉서도 계산기도 이것 없이는 못 쓴다 | 되돌리면 재귀 하강 파서를 못 쓴다 |
|
||||
| 2 | 자기 `drop` 안에서는 필드를 꺼낼 수 있다 (R7 예외) | 객체가 사라지는 중이라 뒤에 남아 읽힐 것이 없다 | `drop(self: Self)` 로 값을 소비하게 바꾸면 R7 을 안 건드려도 된다 |
|
||||
|
||||
---
|
||||
|
||||
## 정해진 것
|
||||
|
||||
| | |
|
||||
@@ -79,6 +67,8 @@ uv run python tests/exec.py 31/31 컴파일된 프로그램이 실제로
|
||||
| 오류 코드 | `error.Name` 을 빌드 전체에서 모아 철자 순으로 1부터 |
|
||||
| 레지스터 | ebx·esi·edi 를 블록 안에 머무는 임시값에 준다. eax/ecx/edx 는 스크래치 |
|
||||
| 해제 | 소유자를 놓으면 그것이 가진 것도 놓는다 (R1). `drop` 을 부른 뒤 필드로 내려간다 — 그래서 `List`/`Arena`/`Map` 은 `drop` 이 없다 |
|
||||
| 배타 대여를 호출에 넘기기 | **이동이 아니라 호출 동안의 재대여** (SPEC §4.2, §5 R6). 없으면 배타 파라미터를 함수당 한 번만 넘길 수 있어 재귀 하강 파서를 못 쓴다 |
|
||||
| 자기 `drop` 안의 부분 이동 | **허용** (SPEC §5 R7 예외). 객체가 사라지는 중이라 뒤에 남아 읽힐 것이 없다 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user