Totoro 3 563 Опубликовано: 9 июня, 2016 (изменено) Итак, устройтесь поудобнее у ваших голубых экранов.Сегодня я научу вас програмировать во Имя Луны! Мы привыкли писать программы для 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-tmbundle2) vim - https://github.com/leafo/moonscript-vim3) Atom - https://atom.io/packages/language-moonscript4) 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 Изменено 30 ноября, 2016 пользователем Totoro 12 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 9 июня, 2016 Я сам хотел написать про мунскрипт, так как я фанат этого языка и пишу Арбузер на нем. Ты меня опередил. И да, я уже несколько раз пытался пересобрать moon компилятор под ОС, но потратив десятки часов изучения исходников остановился на поиске решения с заменой debug функций, отмененных в ОС, но использующихся при компиляции. Буду рад сотрудничать в этом направлении, так как хочу сделать moon-интерпритатор и возможность запускать .moon файлы прямо из OpenOS. Тему желательно перенести в статьи в силу ее образовательной функции, а не форумного обсуждения. P.S. Лайк за ООП. Респект Тоторо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 9 июня, 2016 А почему бы, для установки Debian + Lua5.3 не сорганизовать bat-ник ? Чтобы автоматом устанавливало и фиксило. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 9 июня, 2016 И да, я уже несколько раз пытался пересобрать moon компилятор под ОС, но потратив десятки часов изучения исходников остановился на поиске решения с заменой debug функций, отмененных в ОС, но использующихся при компиляции. Буду рад сотрудничать в этом направлении, так как хочу сделать moon-интерпритатор и возможность запускать .moon файлы прямо из OpenOS. Вот я в ту же тему думаю сейчас. Хочу почитать исходники и подумать, как этом можно сделать. В идеале надо будет собрать в виде пакета для OPPM или нашей новой репы. В общем, будет желание - подрубайся к IRC (http://webchat.esper.net/?channels=cc.ru ), я там почти каждый день. А почему бы, для установки Debian + Lua5.3 не сорганизовать bat-ник ? Чтобы автоматом устанавливало и фиксило. Ну, это просто частный случай же. Я показал, какие действия нужны для того чтобы это поднять на локальной машине, и какие потенциальные грабли могут встретиться. Если ставить это все под Lua 5.1, то ошибок вообще не должно быть. А вообще можно и скрипт соорудить. Если сделаешь что-нибудь такое, кидай ссылку, я прикнопаю к первому посту. =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 9 июня, 2016 (изменено) Меня больше волнует в процессе портировании LPeg Там вроде на debug только эмуляция getfenv/setfenv. Если найдём замену LPeg - можно будет найти какой-то парсер Lua и сделать таблицу с функциями и их сырцами И, мне кажется, всё это дело проще вынести на c9/openshift/другой хост - на опенкомпах будут ЛАГИ Изменено 9 июня, 2016 пользователем evgkul Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 9 июня, 2016 Меня больше волнует в процессе портировании LPeg Там вроде на debug только эмуляция getfenv/setfenv. Если найдём замену LPeg - можно будет найти какой-то парсер Lua и сделать таблицу с функциями и их сырцами И, мне кажется, всё это дело проще вынести на c9/openshift/другой хост - на опенкомпах будут ЛАГИ Если выносить на сторонний сервак, то можно тогда вообще заюзать https://github.com/leafo/moonscript-javascript Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 9 июня, 2016 Опенкомпы умеют юзать javscript? Если node, то, проще как CGI на сайт затолкать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 9 июня, 2016 Я имею ввиду, что один из вариантов - поднять на стороннем серваке "компилятор" MoonScript. По ссылке что я кидал как раз его реализация на JS. То есть поднять вообще ноль проблем. А на компе OC написать несложный клиент, который будет стучаться на сервак и получать транслированный код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 9 июня, 2016 Будет ОЧЕНЬ лагуче, компилятор - либа, сделанная из lua, lpeg и moonscript через emscripten, а cgi умеют почти все веб-сервера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 9 июня, 2016 (изменено) Будет ОЧЕНЬ лагуче, компилятор - либа, сделанная из lua, lpeg и moonscript через emscripten, а cgi умеют почти все веб-сервера Ну, вот эта хрень же работает: http://moonscript.org/compiler/ Можно попробовать на серверную часть то же самое свалить. UPD. Хотя да, ты прав. Будет лагуче. Изменено 9 июня, 2016 пользователем Totoro Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 9 июня, 2016 (изменено) LPeg для Lua уже есть и называется LuLPeg И да, для совместной работы я создал репу на C9, просите доступ кто будет участвовать. https://ide.c9.io/krutoy242/moonoc Я уже изменил там большенство либ и добавил свои, что бы всё запускалось на ОС. Изменено 9 июня, 2016 пользователем Krutoy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 10 июня, 2016 LPeg для Lua уже есть и называется LuLPeg И да, для совместной работы я создал репу на C9, просите доступ кто будет участвовать. https://ide.c9.io/krutoy242/moonoc Я уже изменил там большенство либ и добавил свои, что бы всё запускалось на ОС. Там совместимость с LPeg неполная Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 10 июня, 2016 Там совместимость с LPeg неполная В доках LuLPeg написано, что ВСЕ функции поддерживаются, файл теста выполняется почти полностью, за исключением технических. Вот: LuLPeg passes most of the LPeg test suite: 6093 assertions succeed, 70 fail. None of the failures are caused by semantic differences. They are related to grammar and pattern error checking, stack handling, and garbage collection of Cmt capture values. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 10 июня, 2016 (изменено) Придолбал костыль, вроде работает БЕЗ debug --getfenv и setfenv юзаются только один раз, можно особо не заморачиватся local tablo={} --Окружение local envtablo -- над этой таблицей будут проводится издевательства local function setfenv(func,argtablo) envtablo=argtablo local metatablo ={__index=envtablo,__newindex=envtablo} setmetatable(tablo,metatablo) return func end local function getfenv() return envtablo end local function prepare(func) setfenv(nil,_ENV) return func end return {setfenv=setfenv,getfenv=getfenv,prepare=prepare,tablo=tablo} Изменено 10 июня, 2016 пользователем evgkul Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 10 июня, 2016 Заказываю ЗДОРОВЕННЫЙ файл с кодом на moonscript для тестов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 10 июня, 2016 Бета-версия порта компилятора Moonscript под Opencomputers, портировал я и Krutoy https://github.com/evgkul/moonscript-opencomputers 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 11 июля, 2016 Вопросы оп языку. Заметил, что там можно не использовать скобки при различных конструкциях, чтобы выглядит очень ново и непривычно, еще заметил, что для отделения одних конструкций от других используются белые символы. Это сделано для красоты, или компилятор их распознает с неким смыслом структуризации? Пример: две функции в классе class SomeContainer set: (some) => --как компиль понимает, что функция get не является локальной внутри set? Если не с помощью табуляции, то возможно по "=>", а если бы я использовал "->" и не обращался к контейнеру, а просто возвращал константу? @some=some get: () => @some Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 11 июля, 2016 (изменено) Очевидно, по индентации. Кроме того, для пустых функций необязательно использовать скобки для параметров. А => ты с успехом можешь юзать внутри функции. test = -> -- вот и "=>" func = (a) => @foo = "bar" .. tostring tonumber a func fn = test! a = {foo: "baz"} fn a, 5 print a["foo"] assert a["foo"] == "bar5" Просто нужно понять, что =>, на самом деле, просто работает как : в Луа: добавляет сам в начало аргумент self, который может принимать любое значение. А cls\method a, b, c преобразуется в cls.method cls, a, b, c. Просто синтаксический сахар, не более того. Изменено 11 июля, 2016 пользователем Fingercomp 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 11 июля, 2016 (изменено) Здесь как в Питоне, определенной длины отступ слева обозначает блок кода. То есть пока длина отступа не меняется - это все один блок. Впрочем, для коротких функций в одно выражение, перенос использовать не обязательно, и можно написать что-то такое: -- функция, которая всегда возвращает 10 f = () -> 10 В два выражения уже надо юзать отступ, иначе второе выражение будет считаться идущим после функции (после компиляции окажется за ее пределами): -- Неправильно f = () -> print 'Done'; 10 -- Правильно f = () -> print 'Done' 10 Изменено 11 июля, 2016 пользователем Totoro 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 11 июля, 2016 А есть явные скобки для функций и других выражений? Отступы выглядят, конечно очень красиво и чисто, но ошибки в них, как мне кажется, будет очень трудно искать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах