std: 마찰 보고의 F1/F3/F6/F7 처리 — 292줄이 244줄로
문법은 건드리지 않았다. 표본이 한 사람이 쓴 300줄 하나뿐인데 되돌리기 비싼 축을 움직일 수는 없다. std 보강만 했다. 추가: List.first/nth, String.join, std/option.cool, std/result.cool. samples/app 재작성 결과 config.cool 196 → 148줄. head_or, second_or, Pick, take_at, first_text, first_entry가 통째로 사라졌다. 예측 40줄, 실제 48줄 — F1의 값이 확인됐다. F3은 줄 수로 값이 안 보인다. main.cool은 96줄 그대로다. 4단 중첩 String.concat이 4줄짜리 String.join 배열이 됐으니 줄 수가 같다. 읽기는 확실히 나아졌다. 줄 수는 읽기 좋음의 대리 지표일 뿐이고 여기서 그 대리가 깨진다 — 다음 개밥 먹기는 다른 것을 재야 한다. F7: Interp.implemented와 std/*.cool 선언이 서로를 덮는지 테스트가 양방향 으로 검사한다. 어긋나면 빌드가 깨진다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019ZVDeU6KLuUVL3gs18Hm3E
This commit is contained in:
@@ -184,6 +184,67 @@ pub copyable struct Numbered {
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## 후속 (같은 날)
|
||||
|
||||
F1, F3, F6을 std 보강으로 처리하고 `samples/app`을 다시 썼다. 문법은
|
||||
건드리지 않았다 — 표본이 한 사람이 쓴 300줄 하나뿐인데 되돌리기 비싼 축을
|
||||
움직일 수는 없다.
|
||||
|
||||
추가한 것: `List.first`, `List.nth`, `String.join`, 그리고 `std/option.cool`,
|
||||
`std/result.cool` (`map`, `unwrap_or`, `ok_or`, `map_err`, `is_ok`).
|
||||
|
||||
결과:
|
||||
|
||||
| | 전 | 후 |
|
||||
|---|---|---|
|
||||
| config.cool | 196줄 | **148줄** |
|
||||
| main.cool | 96줄 | 96줄 |
|
||||
| 합계 | 292줄 | **244줄** |
|
||||
|
||||
출력은 한 글자도 다르지 않다.
|
||||
|
||||
**F1의 값이 확인됐다.** 48줄이 사라졌고 전부 config.cool에서 나왔다 —
|
||||
`head_or`, `second_or`, `Pick`, `take_at`, `first_text`, `first_entry`가
|
||||
통째로 없어졌다. 예측(40줄쯤)과 실제(48줄)가 맞았다.
|
||||
|
||||
```cool
|
||||
// 전
|
||||
let key = String.trim(head_or(parts, "")) // + Pick struct + take_at 20줄
|
||||
|
||||
// 후
|
||||
let key = String.trim(Option.unwrap_or(List.nth(parts, 0), ""))
|
||||
```
|
||||
|
||||
**F3은 줄 수로는 값이 안 보인다.** main.cool이 96줄 그대로다. 4단 중첩
|
||||
`String.concat`을 4줄짜리 `String.join` 배열로 바꿨으니 줄 수가 같다.
|
||||
그런데 읽기는 확실히 낫다:
|
||||
|
||||
```cool
|
||||
// 전
|
||||
c.print(String.concat(" ", String.concat(e.key,
|
||||
String.concat(" = ", String.concat(Cfg.show_value(e.value),
|
||||
String.concat(" (", String.concat(Cfg.type_name(e.value), ")")))))))
|
||||
|
||||
// 후
|
||||
c.print(String.join("", [
|
||||
" ", e.key, " = ", Cfg.show_value(e.value),
|
||||
" (", Cfg.type_name(e.value), ")",
|
||||
]))
|
||||
```
|
||||
|
||||
**줄 수는 읽기 좋음의 대리 지표일 뿐이고, F3에서 그 대리가 깨진다.**
|
||||
다음 개밥 먹기에서는 줄 수 말고 다른 것을 재야 한다.
|
||||
|
||||
**F7도 처리했다.** `Interp.implemented` 목록과 `std/*.cool`의 선언이
|
||||
서로를 덮는지 테스트가 양방향으로 검사한다. 어긋나면 빌드가 깨진다.
|
||||
|
||||
남은 것: F4(struct 부분 갱신), F5(fold 인덱스). 둘 다 문법 결정이거나
|
||||
튜플이 필요하다. 표본을 더 모은 뒤에 판단한다.
|
||||
|
||||
---
|
||||
|
||||
## 결론
|
||||
|
||||
v1로 넘길 때 **F1과 F3이 먼저다.** 둘 다 "언어가 틀렸다"가 아니라
|
||||
|
||||
@@ -375,6 +375,9 @@ samples/app — 설정 파서 + 리포트 도구, 2모듈 292줄. 검사기를
|
||||
항목 하나는 확인해 보니 관찰자가 틀린 것이었다 — 개밥 먹기의 불편은
|
||||
언어의 성질일 수도, 쓴 사람의 습관일 수도 있다.
|
||||
전문과 증거는 docs/friction.md. 이것이 v1 설계의 첫 입력이다.
|
||||
후속: std 보강(List.first/nth, String.join, Option/Result 함수)으로 292줄이
|
||||
244줄이 됐다. 문법은 건드리지 않았다 — 표본 하나로 되돌리기 비싼 축을
|
||||
움직일 수는 없다.
|
||||
|
||||
■ 측정 (2026-08, v0 fast path)
|
||||
100,391줄 / 200 모듈 (사슬 의존). bench/bench.ml로 재현.
|
||||
|
||||
Reference in New Issue
Block a user