학습 결과: 이미 몸에 밴 습관을 여기 형태로 옮기고, 어떤 습관이 일부러 대응물 없이 비어 있는지 압니다.
선행 학습: 다른 언어 코드를 읽을 수 있으면 됩니다. 이 언어 경험은 없다고 가정합니다.
그대로 옮겨오는 것부터
겉모습의 상당 부분은 익숙할 겁니다. 값, 이름, 함수, 조건문, 반복문, 컬렉션이 맡는 역할은 알아볼 수 있고, 중요한 차이는 검사기가 명시적으로 드러냅니다. 세부 문법을 모두 배우기 전에도 아래 예제가 무엇을 하는지 대략 말할 수 있을 겁니다.
record Task {
title: string,
minutes: int
}
function totalMinutes(tasks: Array<Task>) -> int {
let mut total = 0
for task in tasks {
total = total + task.minutes
}
total
}파이썬이나 자바스크립트나 자바나 러스트를 써 봤다면 이게 무엇을 하는지 이미 말할 수 있습니다. 여기서 시작하는 이유가 그것입니다. 주의를 기울일 만한 차이는 몇 개 안 되고, 바로 아래 있습니다.
실제로 중요한 차이 넷
변경은 선택해야 합니다. 그냥 let으로 붙인 이름은 다시 대입할 수 없습니다. let mut이라고 써야 재대입이 설계의 일부라고 밝히는 것입니다. 재대입을 쉽게 쓸 수 있는 언어에서는 어떤 이름이 실제로 바뀌는지 알려고 함수의 더 많은 부분을 읽어야 할 때가 많습니다. 여기서는 선언에 답이 있습니다.
복구 가능한 실패는 값입니다. 잡아야 할 예외가 없습니다. 복구 가능한 실패가 있는 함수는 Result를 반환하고, 호출하는 쪽이 실패를 처리하거나 ?로 위에 올려보냅니다. 따라서 본문이나 예외 관례에서 짐작하지 않아도 호출 경계에 실패의 형태가 남습니다. 실행을 중단시키는 오류는 이와 별개의 복구 불가능한 경계입니다.
없음도 타입에 들어갑니다. 일반적인 선택 결과는 Option<T>로 나타냅니다. 외부의 nullable 데이터를 다룰 때는 T | null을 쓸 수 있고, 두 모델은 섞이지 않습니다. 어느 쪽이든 검사기는 값이 있다고 다루기 전에 없는 경우를 처리하게 합니다.
호스트 권한에는 명시적인 경계가 있습니다. 파일과 입출력 연산은 선택한 호스트 또는 제품 프로필을 통해서만 쓸 수 있고, 웹 제품은 선언한 제한형 기능만 받습니다. 함수 서명은 데이터와 복구 가능한 실패를 보여 주며, 임포트와 패키지 설정과 선택한 프로필을 함께 봐야 권한의 전체 모습이 드러납니다. 실제 파일 읽기는 이 단서들을 함께 사용합니다.
일부러 없는 것들
여기 대응물이 없는 습관은 일찍 알아 두는 편이 낫습니다. 그래야 손이 그쪽으로 가지 않습니다.
클래스 계층도 상속도 없습니다. 형태는 레코드이고 동작은 그 레코드를 받는 함수에 있습니다. 기반 클래스와 재정의로 모델링하고 싶어지면 대신 레코드와 명시적인 함수로 모델링하세요.
실행 중에 자기 프로그램을 들여다보는 리플렉션도, 프로토콜 표를 통한 동적 디스패치도, 행 다형성도 없습니다. 정확한 목록은 레코드와 명목 데이터에 있습니다.
숫자 종류 사이의 암묵적 변환이 없습니다. 주변 식이 그편이 편하다는 이유로 int가 float가 되지 않습니다.
이 경계들은 의도된 것입니다. 중요한 선택을 선언과 제품 설정에서 확인할 수 있게 하되, 함수 서명 하나만으로 모든 호스트 상호작용을 설명할 수 있다고 과장하지 않습니다.
첫 한 시간을 위한 대응표
dict나 Map이나 HashMap은 컬렉션에 대응하고 컬렉션과 컴프리헨션에서 다룹니다. 데이터만 담는 class는 흔히 레코드에 대응합니다. 인터페이스 모양의 경계는 명시적인 함수 서명으로 시작하고, 지원되는 제네릭 계약이 필요할 때는 런타임 동적 디스패치가 없는 정적 프로토콜을 사용합니다. 복구 가능한 try와 except 흐름은 반환 타입의 Result에 대응합니다. 일반적인 선택 결과는 Option을, 외부 nullable 데이터는 필요에 따라 T | null을 쓰며 검사기가 둘을 명시적으로 구분합니다.
직접 해 보기
제목으로 작업을 찾는 함수가 필요한데 못 찾을 수도 있습니다. 정답을 보기 전에 결과 타입이 무엇이어야 할지 정해 보세요.
정답
작업이 아니라 작업의 Option입니다. 찾지 못하는 것은 오류가 아니라 조회라는 일의 평범한 결과이므로 없음으로서 타입에 들어갑니다. 조회 자체가 잘못될 수 있다면, 예를 들어 먼저 파일을 읽어야 한다면 그때는 Result가 맞습니다. 없음과 실패 중에 무엇인지 고르는 판단을 이 언어는 명시적으로 요구하고, 서명에서 한 번 정해 두면 호출하는 쪽마다 짐작할 일이 없어집니다.
이어갈 준비가 된 시점
차이 네 가지를 말할 수 있고, 이전 언어의 어떤 습관이 여기 대응물이 없는지 짚을 수 있고, 지금 쓰려는 함수에 대해 없음과 실패 중 무엇인지 고를 수 있으면 됩니다.
아직 안 하셨다면 첫 프로그램부터 과정을 밟으시고, 형태만 빠르게 보고 싶으면 문법 한눈에 보기로 바로 가세요.