std: F5 해결(List.enumerate), F4·F8은 넣지 않는 것으로 닫음
F5 — "튜플이 없어서 enumerate가 불가능하다"고 적었는데 틀렸다. 제네릭 struct 하나면 된다. fold_indexed보다 이쪽이 낫다: enumerate 하나가 기존 each/map/filter/fold 전부와 조합되고, fold_indexed를 만들면 map_indexed, each_indexed가 따라와 "한 개념 한 방식"을 깬다. samples/app에서 Numbered struct가 사라졌다 (244줄 → 232줄). F2에 이어 두 번째로 관찰자가 틀린 사례다. 마찰 8건 중 2건이 "언어가 못 한다"고 적었다가 확인해 보니 되는 것이었다. F4 — 넣지 않는다. 전체 나열이 귀찮은 것은 맞지만 그 귀찮음이 값을 한다. 필드를 추가하면 모든 생성 지점이 컴파일 오류를 내고, 컴파일러가 전부 방문하도록 강제한다. ..base는 그것을 없앤다. "오류를 더 빨리 잡는다"가 1번 목표인데 F4는 정확히 그것을 깎는 거래다. F8 — 넣지 않는다. 진짜 질문은 "미사용 지역 변수를 잡을 것인가"가 아니라 "경고 등급을 만들 것인가"였다. 오류로 넣으면 성가시고, 경고로 넣으면 경고 등급의 첫 입주자가 된다. 경고가 없다는 것은 이 언어의 좋은 성질이고 죽은 지역 변수 하나 때문에 팔 것이 아니다. 둘 다 "보류"가 아니라 "닫음"으로 적는다. 근거를 적어두지 않으면 다음에 같은 논의를 처음부터 다시 한다. 다시 열 조건도 함께 적었다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019ZVDeU6KLuUVL3gs18Hm3E
This commit is contained in:
@@ -182,6 +182,7 @@ let implemented =
|
||||
"list.push";
|
||||
"list.concat";
|
||||
"list.reverse";
|
||||
"list.enumerate";
|
||||
"list.each";
|
||||
"list.map";
|
||||
"list.filter";
|
||||
@@ -225,6 +226,12 @@ let builtin pos name (args : value list) : value =
|
||||
match xs with
|
||||
| [] -> VEnum ("Option", "None", [])
|
||||
| x :: _ -> VEnum ("Option", "Some", [ x ]))
|
||||
| "list.enumerate", [ VList xs ] ->
|
||||
VList
|
||||
(List.mapi
|
||||
(fun i x ->
|
||||
VStruct ("List.Indexed", [ ("i", ref (VInt i)); ("value", ref x) ]))
|
||||
xs)
|
||||
| "list.nth", [ VList xs; VInt i ] -> (
|
||||
match List.nth_opt xs i with
|
||||
| Some x -> VEnum ("Option", "Some", [ x ])
|
||||
|
||||
Reference in New Issue
Block a user