openlang

Elm 컴파일러 에러로 하는 스터디

작은 스터디에서 Elm 컴파일러 에러 메시지를 교재처럼 쓰고 있어요. 각자 일부러 틀린 코드를 가져오고, 다 같이 에러를 읽은 다음에 고치는 식이에요.

레코드 필드 오타는 정말 잘 먹혔어요. fistName이라고 쓰면 컴파일러가 필드를 비교해 보고 firstName <-> fistName을 오타 후보로 짚어 줘요. 다들 바로 알아봤고, 뭐가 틀렸는지 자기 말로 설명도 하더라고요. 컴파일러가 친절하게 알려 줘요. 진짜로요.

문제는 MISSING PATTERNS였어요. type Status = Idle | Loading | Failed String에 Failed를 넣고 case를 안 고치면 빠진 경우를 보여 주면서, 그 분기는 나중에 쓸 거면 Debug.todo를 자리표시자로 쓰라는 힌트를 붙여 줘요. 그런데 몇 명이 그 힌트를 그대로 붙여 넣고 끝냈어요. 컴파일은 되니까요. Failed일 때 화면에 뭘 보여 줄지는 아무도 안 정했고, 그 분기가 실행되는 순간 앱이 죽어요.

힌트가 틀린 건 아니에요. 작업 순서를 도와주려는 말이니까요. 그런데 배우는 입장에서는 "이렇게 고쳐라"로 읽히나 봐요. 다음엔 ReScript로도 같은 걸 해 볼까 해요. variant에 case를 추가하면 처리 안 한 분기를 짚어 주는 건 거기도 똑같으니까요. 혹시 이런 식으로 가르쳐 보신 분 있으면 어땠는지 듣고 싶어요.

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    Debug.todo가 컴파일러를 통과하는 건 스터디에 있어도 괜찮아요. 나중에 갚기만 한다면요. 규칙 하나만 더하고 싶어요. 그걸 쓴 사람은 elm make --optimize를 한 번 돌리는 거예요. 최적화 빌드는 Debug가 남아 있는 코드를 거부하니까, 자리표시자가 누가 배포하는 빌드에 슬쩍 들어갈 수가 없어요.

    그리고 다음에 ReScript로 해 보신다면 같은 불평은 안 나와요. 거기서는 변형 케이스를 빠뜨린 switch가 기본적으로 오류가 아니라 경고라서, 코드는 컴파일되고 경고는 그냥 지나가 버려요. 그게 더 나쁜 연습인지 더 정직한 연습인지는 저도 아직 못 정했어요.

  2. 고유 링크

    처음엔 힌트를 가리고 먼저 예상하게 해 보면 어때요? 에러 제목하고 빠진 경우까지만 보여 주고, 그 분기에서 뭘 해야 할지 각자 적게 하는 거예요. 일단 그렇게 예상해 둬요. 그다음에 힌트를 펼쳐요.

    그렇게 보면 Debug.todo가 정답이 아니라 "아직 안 정함"이라는 표시로 보여요. OCaml 패턴 연습 때도 비슷했어요. 컴파일러 문구보다 자기가 적어 둔 예상이 더 오래 남더라고요.

  3. 고유 링크

    rook77 님, 힌트를 숨기는 건 좋은데 답이 어디로 갈지가 걱정이에요. 빠진 경우만 보여 주고 Failed일 때 뭘 보여 줄지 물으면, 대부분 Failed _ -> text "Error"라고 쓸 것 같거든요. 컴파일되고, 크래시도 안 나고, 타입이 들고 있던 메시지는 버려요. 자리표시자 문제가 어깨 으쓱 문제로 바뀌는 셈이에요. 샘플 데이터에 진짜 오류 메시지를 넣어 두면, 와일드카드를 쓸 때 뭔가 잃는다는 게 눈에 보일까요?

같은 질문의 다른 갈래

  1. round(2.5)가 2라는 걸 학습자들은 안 믿는다

    학습자들은 자꾸 round(2.5)가 3일 거라고 짐작하는데, 제가 주로 쓰는 두 언어는 다 2라고 해요. Python은 정수 2를, Julia는 2.0을 줘요. 둘 다 동점을 짝수 쪽 이웃으로 보내서 round(0.5)는…

  2. 3 + 4 * 2가 14라는 건 쉬운 쪽이다

    Smalltalk을 처음 배우는 사람은 누구나 일찍 3 + 4 * 2를 만나고 그게 14라는 말을 들어요. 이항 메시지는 산술 우선순위 없이 왼쪽에서 오른쪽으로 가니까요. 이 부분은 한 번 보여 주면 기억에 남아요(정말 그냥…

  3. 옛 CoffeeScript를 손으로 옮기는 JavaScript 연습

    유행은 지났지만 생각보다 훨씬 잘 먹히는 연습이 있습니다. 배우는 사람에게 작고 오래된 CoffeeScript 파일을 하나 주고, 컴파일러를 돌리지 말고 현대 JavaScript로 다시 쓰게 하는 것입니다. 거의 모든 설탕…