friction: F2 취소 — else if는 원래 된다

"else if가 없어서 3~4단 중첩이 된다"고 적었는데 틀렸다. parser.ml:480이
처음부터 else 뒤의 if를 처리한다. 확인하지 않고 습관대로 중첩해 쓰고
언어를 탓한 것이다.

고쳐 쓰니 config.cool이 208줄에서 196줄이 되고 parse_line은 4단 중첩에서
평평한 5갈래가 됐다.

개밥 먹기 자체에 대한 교훈이라 문서에 남긴다. 한 사람이 쓴 300줄에서 나온
불편은 언어의 성질일 수도 있고 그 사람의 습관일 수도 있다. 확인 없이 적은
것 하나가 "심각" 등급을 달고 v1 설계 입력이 될 뻔했다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019ZVDeU6KLuUVL3gs18Hm3E
This commit is contained in:
2026-08-30 16:17:30 +09:00
co-authored by Claude Opus 5
parent 5831af7760
commit 7be05be77f
4 changed files with 57 additions and 53 deletions
+20 -32
View File
@@ -37,14 +37,12 @@ pub copyable struct Config {
pub fn parse_value(raw: String) -> Value {
if raw == "true" {
Flag(true)
} else if raw == "false" {
Flag(false)
} else {
if raw == "false" {
Flag(false)
} else {
match Int.parse(raw) {
Ok(n) => Number(n),
Err(_) => Text(raw),
}
match Int.parse(raw) {
Ok(n) => Number(n),
Err(_) => Text(raw),
}
}
}
@@ -70,29 +68,21 @@ pub fn type_name(v: Value) -> String {
// 부르는 쪽이 두 겹을 벗겨야 한다. Config 하나에 둘 다 모으는 편이 낫다.
pub fn parse_line(cfg: Config, no: Int, raw: String) -> Config {
let line = String.trim(raw)
let parts = String.split(line, "=")
if String.is_empty(line) {
cfg
} else if String.starts_with(line, "#") {
cfg
} else if List.len(parts) != 2 {
add_problem(cfg, no, String.concat("= 가 하나여야 합니다: ", line))
} else if String.is_empty(String.trim(head_or(parts, ""))) {
add_problem(cfg, no, "이름이 비어 있습니다")
} else {
if String.starts_with(line, "#") {
cfg
} else {
let parts = String.split(line, "=")
if List.len(parts) == 2 {
let key = String.trim(head_or(parts, ""))
let val = String.trim(second_or(parts, ""))
if String.is_empty(key) {
add_problem(cfg, no, "이름이 비어 있습니다")
} else {
add_entry(cfg, Entry {
line: no,
key: key,
value: parse_value(val),
})
}
} else {
add_problem(cfg, no, String.concat("= 가 하나여야 합니다: ", line))
}
}
add_entry(cfg, Entry {
line: no,
key: String.trim(head_or(parts, "")),
value: parse_value(String.trim(second_or(parts, ""))),
})
}
}
@@ -134,12 +124,10 @@ pub copyable struct Pick {
pub fn take_at(p: Pick, x: String, want: Int) -> Pick {
if p.taken {
Pick { taken: true, at: p.at + 1, found: p.found }
} else if p.at == want {
Pick { taken: true, at: p.at + 1, found: x }
} else {
if p.at == want {
Pick { taken: true, at: p.at + 1, found: x }
} else {
Pick { taken: false, at: p.at + 1, found: p.found }
}
Pick { taken: false, at: p.at + 1, found: p.found }
}
}