hosts 파일에 잘못된 줄이 있으면 로그만 남기고 계속 로드하도록 매크로를 하나 짰어요. 전체 코드는 이거예요:
(defmacro with-lenient-parse ((&key (log t)) &body body)
`(handler-bind ((missing-field
(lambda (c)
(when ,log
(format *error-output* "skipping: ~A~%" c))
nil))
(bad-port
(lambda (c)
(when ,log
(format *error-output* "warn: ~A~%" c))
nil)))
,@body))
parse-line에는 skip-line restart가 있는데, 이걸 실제로 호출하는 곳이 있는지는 잘 모르겠어요. 입력은 한 줄에 호스트 하나씩 name addr [port] 형식이고, sh run.sh로 실행해요.
파일에 web-02(addr 없음)가 있으면 stderr에 skipping: line 2: missing addr가 찍혀요. 그다음에 SBCL이 똑같은 missing-field 에러로 디버거에 빠지고 스크립트가 죽어요. 핸들러에서 리턴하면 parse-line이 그 줄에 대해 nil을 리턴할 거라고 생각했는데, 아닌가 봐요.
거기를 넘어가려고 web-02 줄을 지웠어요. 이번에는 warn: line 4: bad port abc가 찍히고, 그다음에 privileged-p에서 NIL is not of type NUMBER라는 type error가 나요. 그 함수는 파싱이랑 아무 상관이 없는데요. port 컨디션은 warning 서브클래스를 그냥 signal하는 거고, 제가 쓴 코드에서 그걸 fatal로 취급하는 곳도 없어요.
이게 버그 두 개인가요, 아니면 핸들러가 걸리는 방식을 제가 하나 잘못 이해한 건가요? 이 매크로는 호출하는 쪽에 실제로 뭘 보장하는 건가요? 트랜스크립트를 기억에 의존해서 쓰는 거라 전체 백트레이스는 못 붙여요.