Итак, устройтесь поудобнее у ваших голубых экранов. Сегодня я научу вас програмировать во Имя Луны!
Мы привыкли писать программы для OpenComputers на Луа. И при этом не задумываемся о том, что язык Луа в OpenComputers - это по сути "язык низкого уровня". На нем мы пишем все - начиная от прошивок BIOS и операционных систем, и заканчивая чатиками для OpenGlasses. Однако, когда объем кода не имеет решающей роли, и есть время для медитации, программист может дать душе отдохнуть, используя красивые конструкции высокоуровневых языков. И таким языком сегодня станет MoonScript. # Что это такое? MoonScript - это язык с интересным и лаконичным синтаксисом. Он позволяет использовать привычные конструкции ООП (объектно-ориентированное программирование) и ФП (функциональное программирование) в сеттинге Луа. Сам автор называет его "CoffeeScript for Lua". Код на MoonScript хранится в файликах с расширением *.moon и транслируется в обычный код Lua. Который может затем быть выполнен на компьютерах или роботах OpenComputers. Плюсы: * краткий и красивый код (субъективно) * изучение нового, интересного (объективно) Минусы: * Транслированный код хуже читаем, и немного объемнее, чем аналогичный код, написанный изначально на Луа # Установка Приведу пример установки для Debian + Lua5.3. Если у вас другая OS - смотрите соответствующие инструкции по ссылкам. 1) Lua (https://www.lua.org/start.html)
$ sudo apt-get install lua5.3
2) Пакетный менеджер LuaRocks (https://luarocks.org/#quick-start) Для его установки возможно потребуется пакет liblua5.3-dev. Установим его командой:
$ sudo apt-get install liblua5.3-dev
Далее следуем инструкциям с официального сайта:
$ wget http://luarocks.org/releases/luarocks-2.3.0.tar.gz
$ tar zxpf luarocks-2.3.0.tar.gz
$ cd luarocks-2.3.0
$ ./configure; sudo make bootstrap
3) Ставим пакеты MoonScript (http://moonscript.org/#installation)
$ sudo luarocks install moonscript
Теперь в системе появятся программы moon и moonc. Ура! К слову, при их запуске может вылетать ошибка типа
/usr/local/share/lua/5.3/alt_getopt.lua:24: attempt to call a nil value (global 'module')
Это происходит потому, что moonscript давненько уже не обновлялся, и использует устаревшее ключевое слово module. Фиксится при помощи правки файликов alt_getopt.lua и moon. В файле alt_getopt.lua необходимо закомментировать 24 строку (module ("alt_getopt")) и дописать в самый конец строку
return {get_opts = get_opts, get_ordered_opts = get_ordered_opts}
В файле moon исправляем вторую строку на
local alt_getopt = require("alt_getopt")
Все это в нашем случае можно сделать командами:
$ sudo gedit /usr/local/share/lua/5.3/alt_getopt.lua
$ sudo gedit /usr/local/lib/luarocks/rocks/moonscript/0.4.0-1/bin/moon
Все! MoonScript установлен, пропатчен и готов к работе. # Подсветка синтаксиса Очень рекомендую писать код в редакторе заточенном под код. Чертовски удобно, поверьте. Для MoonScript существуют пакеты подсветки синтаксиса для разных редакторов. 1) Sublime Text / Text Mate - https://github.com/leafo/moonscript-tmbundle 2) vim - https://github.com/leafo/moonscript-vim 3) Atom - https://atom.io/packages/language-moonscript 4) Textadept - https://github.com/leafo/moonscript-textadept # А теперь - магия! Для примера, я переписал код библиотечки Braille Bicycle с использованием MoonScript. Теперь она использует ООП подход (привет, @Krutoy ). http://pastebin.com/NQc7JCH3 Этот файлик я потом "откомпилировал" в Lua простой командой:
$ moonc braille.moon
И получил на выходе рабочую библиотеку braille.lua. Далее, заливаем ее в OC и пишем простой тестовый код:
local gpu = require('component').gpu
local braille = require('braille')
local matrix = braille.Matrix(8, 8)
matrix:line(1, 1, 8, 1)
matrix:set(1, 2); matrix:line(4, 2, 5, 2); matrix:set(8, 2)
matrix:set(1, 3); matrix:line(4, 3, 5, 3); matrix:set(8, 3)
matrix:line(1, 4, 3, 4); matrix:line(6, 4, 8, 4)
matrix:line(1, 5, 2, 5); matrix:line(7, 5, 8, 5)
matrix:line(1, 6, 2, 6); matrix:line(7, 6, 8, 6)
matrix:line(1, 7, 2, 7); matrix:line(4, 7, 5, 7); matrix:line(7, 7, 8, 7)
matrix:line(1, 8, 8, 8)
gpu.setForeground(0xC61331)
matrix:render(gpu, 14, 12)
matrix:render(gpu, 46, 12)
gpu.setForeground(0xFFFFFF)
matrix:render(gpu, 30, 12)
matrix:render(gpu, 62, 12)
И вуаля! Работает.
# Игровая трансляция Все это хорошо, но иногда может быть полезна возможность использовать *.moon исходники прямо из OC, без предварительной компиляции. Уже поздно, поэтому расскажу об этом как-нибудь в другой раз.
Скажу лишь, что помимо всего прочего, у MoonScript есть такая любопытная тулза, как онлайн "компилятор". Его можно найти вот здесь:
http://moonscript.org/compiler/
# UPD
Товарищи @Krutoy и @evgkul выпустили транслятор MoonScript на чистом Луа, что позволяет запускать и "компилировать" программы MoonScript прямо из OpenOS.
Заценить и потестить можно по этой ссылке:
https://github.com/evgkul/moonscript-opencomputers
Пишите багрепорты (сюда или на GitHub), и отправляйте свои пуллреквесты, чтобы улучшить программу.
# UPD 3
Добавил MoonScript в репозиторий. Теперь можно установить его и потестить всего одной командой:
hpm install moon