Поради щодо роботи з Unison локально через Exercism CLI
Ми пишемо код 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.
Відео з покроковим розбором показує робочий процес для старішої версії 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). Про це розповімо далі.
Повний список команд 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.
Якщо виникнуть будь-які проблеми, повідомте нам! 🙂