Робота з командним рядком

Поради щодо роботи з Unison локально через Exercism CLI


Написання й обчислення коду Unison

Ми пишемо код Unison у файлах із суфіксом .u. Ми називаємо їх «чернетками», бо використовуємо їх для написання коду Unison, але саме Unison Codebase Manager (UCM) зрештою зберігає вміст цих файлів. Ми й далі будемо надсилати ці файли через Exercism CLI, але UCM можна вважати «джерелом істини» для коду Unison.

Хоча в Unison немає REPL (Read Evaluate Print Loop), ми можемо швидко обчислювати вирази Unison у «watch expressions». У файлі із суфіксом .u почніть рядок із > і впишіть вираз праворуч.

> myFunction 42 "hi"

UCM покаже результати обчислення виразу після збереження файлу. Це стане в пригоді, коли ми шукаємо помилки у своїх реалізаціях вправ.

Для глибшого занурення в робочий процес Exercism ось відео з покроковим розбором реалізації та тестування вправи з Exercism.

Caution

Відео з покроковим розбором показує робочий процес для старішої версії Unison. Новий робочий процес описано тут, разом із новим процесом роботи з проєктами.

Організація кодової бази

Кодова база Unison організована за «просторами імен». Простори імен працюють трохи схоже на каталоги у файловій системі, тільки замість файлів вони містять наші типи та функції Unison. Шляхи просторів імен розділяються крапками, .. Наприклад, до простору імен Text у просторі імен base ми звертаємося як base.Text.

Радимо створити окремий простір імен для кожної вправи, яку ми виконуємо, або перейти в нього командою cd.

Імпорти

Синтаксис Unison для керування імпортами та їх зазначення, це синтаксис use. Наприклад, use base.data.List додає всі функції з простору імен base.data.List до області видимості. Це може стати в пригоді, коли ми застосовуємо функцію на кшталт map до List і її треба відрізнити від інших функцій map, як-от Optional.map. Можна також імпортувати конкретні функції: після простору імен перелічуємо потрібні функції через пробіл, як тут: use base.data.List tails head flatMap.

Синтаксис use можна застосовувати і на верхньому рівні файлу, і всередині функцій, щоб задати імпорти. Конструкції use підкоряються правилам лексичної області видимості, тому глибше вкладені імпорти мають пріоритет над менш вкладеними.

Стандартна бібліотека

Стандартна бібліотека Unison називається base. Типово вона завантажується в нові кодові бази Unison. Переглянути функції, доступні нашим реалізаціям, можна в онлайн-репозиторії коду Unison, Unison share, або через локальний інтерфейс кодової бази, або за допомогою пошуку в 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 приймають як відносні шляхи до просторів імен, так і повністю кваліфіковані шляхи. Повністю кваліфіковані шляхи починаються з ., що позначає «корінь» нашої кодової бази.

Переміщатися UCM можна командою cd в інтерфейсі командного рядка. Якщо простору імен не існує, cd створить його, коли ми в нього перейдемо. Щоб піднятися на рівень вище, скористайтеся cd ...

Розвʼязання проблем

Коли я завантажую тести, UCM не може знайти реалізацію моєї вправи.

Перш ніж завантажувати тести, збережіть файл-заготовку у своєму текстовому редакторі та виконайте update для термінів у кодовій базі.

Я натрапляю на конфлікти назв. Не можу мати два терміни з назвою tests.

Можна мати два терміни з однаковою назвою в різних просторах імен. Коли ми виконуємо вправи Exercism, радимо створити окремий простір імен для кожної вправи, щоб тести та заготовки не змішувалися з іншими.

Мої тести проходять локально, але не проходять у тест-раннері.

Прикро, що так сталося! Спершу перевірте, що імпорти не посилаються ні на що, крім стандартної бібліотеки base та функцій, визначених у файлі scratch, який тестується. Якщо це так, повідомте нам у Slack-каналі Exercism #track-unison або створіть issue в репозиторії треку Unison.

Якщо виникнуть будь-які проблеми, повідомте нам! 🙂