naming: panic을 crash로 — 그리고 이름을 고르는 원칙을 철학에 넣는다
철학 6번을 추가했다: 이름은 관례가 아니라 뜻에서 고른다 — 낯섦은 한 번 치르고 끝나지만 부정확함은 읽는 사람마다 매번 치른다. 판정 방법도 같이 적었다. 그 단어로 평범한 문장을 써 보고, 단어가 문장을 도우면 맞는 이름이고 싸우면 틀린 이름이다. "크래시는 복구하는 것이 아니라 조사하는 것이다" — 돕는다 "패닉은 복구할 수 없다" — 다른 언어에서는 할 수 있어 싸운다 panic의 자연어 뜻은 "갑작스러운 공포"다. 반응하는 쪽의 감정이지 결함에 대한 말이 아니다. 그리고 Go/Rust에서는 붙잡을 수 있어 이름이 거짓말을 한다. crash는 "계획 없이 갑자기 완전히 망가져 끝남"이고 복구의 함의가 없다 — 크래시는 복구하는 게 아니라 조사하는 것이다. 어휘의 출신도 이유가 됐다. panic+recover는 Go 전통이고 거기엔 감독이 없다. crash+supervision은 얼랭 전통이며, 우리가 만드는 것이 그쪽이다. 한국어 용어도 세 층으로 정리했다: 실패(Result) / 결함(crash) / 감독. 세 층이 세 가지 다른 기제로 규율된다 — 타입, 없음(발산), capability. "상황이 나쁨"은 결함이 아니라 실패다. 이 선을 안 그으면 crash가 게으름의 배출구가 된다. "오류"는 컴파일러 진단에만 쓴다. 얼랭 질문에 대한 답도 기록했다: 감독은 가져오고 비구조적 spawn은 안 가져온다. sc.spawn과 sup.spawn(sc, f)로 갈리며 문법 변경이 없다 — 실패를 삼키려면 Supervisor를 받았어야 하고 그것이 시그니처에 보인다. 개명은 문법을 먼저 고치고 대조 장치로 확인했다. 문장 500개, 파일 26개 모두 갈림 0건. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019ZVDeU6KLuUVL3gs18Hm3E
This commit is contained in:
+6
-6
@@ -55,7 +55,7 @@
|
||||
* "pub" | "fn" | "struct" | "enum" | "capability" | "const" |
|
||||
* "import" | "as" | "reexport" | "let" | "mut" | "own" | "affine" |
|
||||
* "copyable" | "effects" | "return" | "if" | "else" | "match" |
|
||||
* "scope" | "panic" | "test" | "true" | "false"
|
||||
* "scope" | "crash" | "test" | "true" | "false"
|
||||
(* 생성 끝 *)
|
||||
*
|
||||
* 다중 줄 목록(파라미터, 인자, 필드, variant, 리스트 리터럴)은 후행 콤마가
|
||||
@@ -244,13 +244,13 @@ primary<s> = literal
|
||||
| match_expr
|
||||
| scope_expr
|
||||
| "(" , expr , ")"
|
||||
| panic_expr
|
||||
| crash_expr
|
||||
| name_or_struct<s> ;
|
||||
|
||||
(* panic은 복구 불가능한 실패다. 되돌아올 수 없으므로 타입이 Never이고,
|
||||
(* crash는 복구 불가능한 결함이다. 되돌아올 수 없으므로 타입이 Never이고,
|
||||
* Never는 어떤 타입 자리에도 놓일 수 있다 — 그래야 match 팔에서 쓸 수 있다.
|
||||
*
|
||||
* effect가 아니다. 경계 검사 하나 넣었다고 {Panic}이 호출자 전부로
|
||||
* effect가 아니다. 경계 검사 하나 넣었다고 {Crash}가 호출자 전부로
|
||||
* 전염되면 effect 절은 신호가 아니라 잡음이 된다. 발산이 effect가 아닌
|
||||
* 것과 같은 이유다 — 무한 루프도 추적하지 않는다.
|
||||
*
|
||||
@@ -258,11 +258,11 @@ primary<s> = literal
|
||||
* 시그니처에 안 적히므로 철학 1과 충돌한다. 런타임은 격리 경계를 가질 수
|
||||
* 있다 (테스트 러너가 첫 사례).
|
||||
*
|
||||
* 되감기를 하지 않는다. panic 시 자원 해제 여부는 자원 모델과 함께
|
||||
* 되감기를 하지 않는다. crash 시 자원 해제 여부는 자원 모델과 함께
|
||||
* 결정한다 — 지금은 열어둔다.
|
||||
*
|
||||
* 키워드인 이유: prelude가 없어서 함수로 두면 쓸 때마다 import해야 한다 *)
|
||||
panic_expr = "panic" , "(" , expr , ")" ;
|
||||
crash_expr = "crash" , "(" , expr , ")" ;
|
||||
|
||||
(* ident 하나로는 이름인지 struct 리터럴인지 갈리지 않는다. "{"를 보고
|
||||
* 갈리므로 왼쪽으로 인수분해해 적는다 — 파서가 실제로 하는 일이다 *)
|
||||
|
||||
Reference in New Issue
Block a user