From 5e70712578e3a4d125685eff70039f4d3a6dafe7 Mon Sep 17 00:00:00 2001 From: coolguy Date: Sun, 30 Aug 2026 16:27:08 +0900 Subject: [PATCH] =?UTF-8?q?friction:=20F8=20=EC=B6=94=EA=B0=80=20=E2=80=94?= =?UTF-8?q?=20=EB=AF=B8=EC=82=AC=EC=9A=A9=20=EC=A7=80=EC=97=AD=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EC=95=88=20=EC=9E=A1=EB=8A=94=EB=8B=A4,?= =?UTF-8?q?=20=EA=B7=B8=EB=A6=AC=EA=B3=A0=20=ED=98=84=ED=99=A9=ED=91=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 투어용 예제를 쓰다 발견했다. 미사용 import는 오류로 막으면서 미사용 지역 변수와 파라미터는 통과시킨다. 규칙이 고르지 않아 보인다. 다만 근거의 성격이 다르다. import를 막은 이유는 재검사 범위를 넓히기 때문이고 그건 이 아키텍처의 실제 비용인데, 죽은 지역 변수에는 그 비용이 없다. 그래서 "고치면 되는 항목"이 아니라 판단이 필요한 항목으로 적는다. 지금은 고치지 않는다. 다음 개밥 먹기에서 죽은 지역 변수를 실제로 남긴 적이 있는지 세어보고 결정한다. 셀 근거가 없으면 넣지 않는 것이 기능 추가 관문의 기본값이다. 문서 맨 앞에 현황표를 넣었다 — 무엇이 해결됐고 무엇이 열려 있는지가 한눈에 보여야 한다. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_019ZVDeU6KLuUVL3gs18Hm3E --- docs/friction.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) 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은 고치는 것이 옳은지 자체가 +불분명하다. 셋 다 표본을 더 모은 뒤에 판단한다. ---