friction: F8 추가 — 미사용 지역 변수를 안 잡는다, 그리고 현황표
투어용 예제를 쓰다 발견했다. 미사용 import는 오류로 막으면서 미사용 지역 변수와 파라미터는 통과시킨다. 규칙이 고르지 않아 보인다. 다만 근거의 성격이 다르다. import를 막은 이유는 재검사 범위를 넓히기 때문이고 그건 이 아키텍처의 실제 비용인데, 죽은 지역 변수에는 그 비용이 없다. 그래서 "고치면 되는 항목"이 아니라 판단이 필요한 항목으로 적는다. 지금은 고치지 않는다. 다음 개밥 먹기에서 죽은 지역 변수를 실제로 남긴 적이 있는지 세어보고 결정한다. 셀 근거가 없으면 넣지 않는 것이 기능 추가 관문의 기본값이다. 문서 맨 앞에 현황표를 넣었다 — 무엇이 해결됐고 무엇이 열려 있는지가 한눈에 보여야 한다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019ZVDeU6KLuUVL3gs18Hm3E
This commit is contained in:
+48
-2
@@ -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. 시그니처가 프로그램의 전부를 말한다.**
|
**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`의 선언이
|
**F7도 처리했다.** `Interp.implemented` 목록과 `std/*.cool`의 선언이
|
||||||
서로를 덮는지 테스트가 양방향으로 검사한다. 어긋나면 빌드가 깨진다.
|
서로를 덮는지 테스트가 양방향으로 검사한다. 어긋나면 빌드가 깨진다.
|
||||||
|
|
||||||
남은 것: F4(struct 부분 갱신), F5(fold 인덱스). 둘 다 문법 결정이거나
|
남은 것: F4(struct 부분 갱신), F5(fold 인덱스), F8(미사용 지역 변수).
|
||||||
튜플이 필요하다. 표본을 더 모은 뒤에 판단한다.
|
앞의 둘은 문법 결정이거나 튜플이 필요하고, F8은 고치는 것이 옳은지 자체가
|
||||||
|
불분명하다. 셋 다 표본을 더 모은 뒤에 판단한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user