diff --git a/docs/friction.md b/docs/friction.md index 3f5239b..66bf803 100644 --- a/docs/friction.md +++ b/docs/friction.md @@ -12,6 +12,23 @@ v0의 샘플 16개는 전부 검사기를 시험하려고 쓴 것이고, 그래 --- +## 현황 한눈에 + +| | 항목 | 상태 | +|---|---|---| +| F1 | 리스트의 n번째를 꺼낼 방법이 없다 | **해결** — `List.first`, `List.nth` | +| F2 | ~~`else if`가 없다~~ | **취소** — 관찰자가 틀렸다 | +| F3 | `String.concat`이 2항이라 중첩 지옥 | **해결** — `String.join` | +| F4 | struct의 한 필드만 바꿀 방법이 없다 | **열림** — 문법 결정, 보류 | +| F5 | fold에 인덱스가 없다 | **열림** — 튜플 필요, 보류 | +| F6 | Option/Result에 조작 함수가 없다 | **해결** — `std/option`, `std/result` | +| F7 | std와 인터프리터가 어긋날 수 있다 | **해결** — 양방향 테스트 | +| F8 | 미사용 지역 변수·파라미터를 안 잡는다 | **열림** — 판단 필요 | + +열린 셋은 전부 의도적으로 남긴 것이다. F4와 F5는 문법을 건드려야 하고, +표본이 한 사람이 쓴 300줄 하나뿐인데 되돌리기 비싼 축을 움직일 수는 없다. +F8은 고치는 것이 옳은지 자체가 불분명하다. + ## 잘 된 것부터 **1. 시그니처가 프로그램의 전부를 말한다.** @@ -184,6 +201,34 @@ pub copyable struct Numbered { --- +### F8. 미사용 지역 변수와 파라미터를 안 잡는다 (판단 필요) + +투어용 예제를 쓰다 발견했다. 이 코드가 아무 말 없이 통과한다: + +```cool +pub fn f(used: Int, never_used: Int) -> Int { + let alive = used + 1 + let dead = 999 + alive +} +``` + +**미사용 import는 오류로 막아놓고 미사용 지역 변수는 통과시킨다.** 둘 다 +"쓰지 않는 선언"인데 한쪽만 잡으니 규칙이 고르지 않아 보인다. + +다만 근거의 성격은 다르다. import를 막은 이유는 재검사 범위를 넓히기 +때문이었고 — 그건 이 아키텍처의 실제 비용이다 — 미사용 지역 변수에는 +그런 비용이 없다. 그냥 죽은 코드다. + +그래서 이것은 "고치면 되는 항목"이 아니라 **판단이 필요한 항목**이다. +철학 1(오류를 더 빨리 잡는다)에는 부합하지만, 디버깅 중에 한 줄 주석 +처리했다고 컴파일이 막히는 것은 실제로 성가시다. 그 성가심이 잡아주는 +버그보다 큰지는 지금 데이터로 알 수 없다. + +> 제안: 지금은 고치지 않는다. 다음 개밥 먹기에서 **죽은 지역 변수를 +> 실제로 남긴 적이 있는지**를 세어보고 결정한다. 세어볼 근거가 없으면 +> 넣지 않는 것이 기능 추가 관문의 기본값이다. + --- ## 후속 (같은 날) @@ -240,8 +285,9 @@ c.print(String.join("", [ **F7도 처리했다.** `Interp.implemented` 목록과 `std/*.cool`의 선언이 서로를 덮는지 테스트가 양방향으로 검사한다. 어긋나면 빌드가 깨진다. -남은 것: F4(struct 부분 갱신), F5(fold 인덱스). 둘 다 문법 결정이거나 -튜플이 필요하다. 표본을 더 모은 뒤에 판단한다. +남은 것: F4(struct 부분 갱신), F5(fold 인덱스), F8(미사용 지역 변수). +앞의 둘은 문법 결정이거나 튜플이 필요하고, F8은 고치는 것이 옳은지 자체가 +불분명하다. 셋 다 표본을 더 모은 뒤에 판단한다. ---