명령줄에서 작업하기

Exercism CLI로 로컬에서 Unison을 다루는 팁


Unison 코드 작성하고 평가하기

Unison 코드는 .u 확장자를 가진 파일에 작성해요. 이 파일들을 "scratch" 파일이라고 부르는데, Unison 코드를 작성하는 데 쓰기 때문이에요. 하지만 그 파일 내용을 최종적으로 저장하고 보관하는 건 Unison Codebase Manager(UCM)예요. 이 파일들은 앞으로도 Exercism CLI로 제출하지만, UCM을 Unison 코드의 "기준"으로 볼 수 있어요.

Unison에는 REPL(읽고 평가하고 출력하는 루프)이 없지만, "watch 표현식"에서 Unison 표현식을 빠르게 평가할 수 있어요. .u 확장자 파일에서 >로 줄을 시작하고 오른쪽에 표현식을 입력해요.

> myFunction 42 "hi"

파일을 저장하면 UCM이 표현식을 평가한 결과를 보여줘요. 연습 문제 구현에 문제가 있을 때 살펴보는 데 활용할 수 있어요.

Exercism 워크플로를 더 깊이 알아보고 싶다면, Exercism 문제를 구현하고 테스트하는 과정을 담은 단계별 안내 영상이 있어요.

Caution

이 단계별 안내 영상은 예전 버전의 Unison 워크플로를 보여줘요. 새 워크플로는 새 프로젝트 워크플로를 다루는 여기에서 확인해요.

코드베이스 구성

Unison 코드베이스는 "네임스페이스"로 구성돼요. 네임스페이스는 파일 시스템의 디렉터리와 비슷하지만, 파일 대신 Unison 타입과 함수를 담아요. 네임스페이스 경로는 점, .으로 구분해요. 예를 들어 base 네임스페이스 안의 Text 네임스페이스는 base.Text로 나타낼 수 있어요.

연습 문제마다 그 문제를 풀기 위한 네임스페이스를 만들거나 cd로 그곳으로 이동하는 걸 권장해요.

임포트

Unison에서 임포트를 관리하고 지정하는 문법은 use 문법이에요. 예를 들어 use base.data.List는 base.data.List 네임스페이스 아래의 모든 함수를 스코프로 가져와요. List에 map 같은 함수를 쓸 때 Optional.map처럼 다른 map 함수들과 구분해야 하는 상황에서 유용해요. 네임스페이스 뒤에 공백으로 구분한 함수 목록을 붙여 특정 함수만 임포트할 수도 있어요. 예를 들면 use base.data.List tails head flatMap이에요.

use 문법은 파일의 최상위에서도, 함수 안에서도 임포트를 지정할 때 사용할 수 있어요. use 절은 렉시컬 스코핑 규칙을 따르기 때문에, 더 안쪽에 중첩된 임포트가 바깥쪽 임포트보다 우선해요.

표준 라이브러리

Unison의 표준 라이브러리는 base라고 불러요. 새 Unison 코드베이스에는 기본적으로 내려받아져 있어요. 구현에 사용할 수 있는 함수는 Unison 코드 온라인 저장소인 Unison share에서, 또는 로컬 코드베이스 UI에서, 또는 Unison Codebase Manager(UCM)에서 검색해서 살펴볼 수 있어요. 검색 방법은 바로 다음에 설명할게요.

Unison Codebase Manager(UCM) 탐색하기

UCM에서 help를 입력하면 전체 UCM 명령어 목록을 볼 수 있지만, 여기 몇 가지 팁과 관례를 소개할게요.

UCM에서 find 명령어로 이름이나 네임스페이스 접두사로 용어를 검색할 수 있는데, find는 코드베이스의 타입 기반 검색도 지원해요. 타입 시그니처로 함수를 검색하려면 find를 입력하고 공백과 콜론을 붙여요. 예를 들어 find : [a] -> [[a]]처럼요.

ls 명령어로 네임스페이스의 내용을 나열할 수 있어요. 예를 들어 ls base.data.List나 ls .exercism.helloWorld처럼요. UCM의 많은 명령어는 상대 네임스페이스 경로 인자와 완전히 정규화된 네임스페이스 인자를 모두 받아들여요. 완전한 경로는 코드베이스의 "루트"를 나타내는 .로 시작해요.

CLI에서 cd 명령어로 UCM 안을 이동해요. 존재하지 않는 네임스페이스로 이동하면 cd가 그 네임스페이스를 새로 만들어요. 상위 네임스페이스로 올라가려면 cd ..를 사용해요.

문제 해결

테스트를 로드할 때 UCM이 연습 문제 구현을 찾지 못해요.

테스트를 로드하기 전에 텍스트 편집기에서 스텁 파일을 저장하고 코드베이스의 용어를 update했는지 확인해요.

이름 충돌이 생겨요. tests라는 용어를 두 개 둘 수가 없어요.

서로 다른 네임스페이스에서는 같은 이름의 용어 두 개를 가질 수 있어요. Exercism 연습 문제를 풀고 있다면, 테스트와 스텁이 다른 것들과 분리되도록 연습 문제마다 별도의 네임스페이스를 만드는 걸 권장해요.

로컬에서는 테스트가 통과하는데 테스트 러너에서는 통과하지 못해요.

죄송해요! 먼저 임포트가 표준 라이브러리인 base와 테스트 중인 scratch 파일에 정의된 함수 외에 다른 것을 참조하지 않는지 확인해요. 그렇다면 #track-unison Exercism 슬랙에서 알려주거나 Unison 트랙 저장소에 이슈를 등록해 주세요.

문제가 있으면 언제든 알려주세요! 🙂