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:
+20
-32
@@ -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 }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user