Exeteres
-
Публикации
26 -
Зарегистрирован
-
Посещение
-
Победитель дней
8
Сообщения, опубликованные пользователем Exeteres
-
-
Удалось реализовать простой отладчик для OpenOS. На данный момент он может собирать информацию о потоках, отлавливать в них ошибки и передавать в VSCode через интернет карту. Для сериализации используется библиотека json.lua, которая устанавливается вместе с клиентом отладчика командой OC-TS: Install client. В OpenOS клиент запускается командой tsdbg, после чего сразу же подключается к редактору.
Можно отлаживать как Lua, так и TypeScript код. Если в папке со сгенерированными lua-файлами будут сурсмапы, то они будут использованы для преобразования стека вызовов. Скрин. Отладчик доступен в новой версии расширения; команда OC-TS: Init теперь генерирует конфигурацию для отладки.
А теперь про брейкпоинты и инспекцию переменных. В OpenComputers существует всего 4 debug функции, среди которых нет всеми любимого sethook. У меня пока только одна идея - вставлять после каждой строки в отлаживаемом файле вызов функции, который проверяет необходимость остановки и собирает стек и переменные. Другой вопрос - насколько все это будет замедлять выполнение программы. Тем не менее, других вариантов у меня нет; может быть кто-нибудь предложит альтернативу.
P. S. Запросы к localhost оказывается по умолчанию делать нельзя. Поэтому для работы отладчика внутри самой игры необходимо разрешить запросы в settings.conf -> internet -> blacklist. Не исключено, что в будущем отладчик получит возможность работать через интернет подобно различным мостам, чтобы позволить игрокам с удобством писать код на публичных серверах.
-
3
-
1
-
-
Как я понял, в результате взаимодействия с пользователем вовзращается таблица, содержащая все указанные данные. В последнем примере она записана в переменную data. Ничего не мешает использовать в коде поля этой таблицы: data[1], data[2] ... Если очень хочется, их можно будет перезаписать в переменные:
local text = data[1]
Или можно использовать table.unpack:
local text, fileFormat, sexOrientation = table.unpack(data)
Кстати, как сказал сам автор, она уже устарела и рекомендуется использовать библиотеку GUI.
-
1 час назад, hohserg сказал:Форкнул opc-types, добавил декларации для AE2 и OpenPeripheral. opc-types возможно тестить не таская .d.ts в проект вручную?
В репозитории есть папка examples. Можно тестировать в ней. (там есть npm команда build-examples) Если писать примеры достаточно аккуратно, лучше их там оставить.
-
1
-
-
29 минут назад, hohserg сказал:Есть готовый класс https://github.com/TypeScriptToLua/TypeScriptToLua/blob/master/src/lualib/declarations/luatable.d.ts
И его вроде нужно юзать так ```LuaTable<{},any>```
Только никак не пойму: как его импортировать?
Скорее всего он не включен в состав npm пакета.
Я могу лишь добавить его к тайпингам opencomputers, хотя это и не логично.
-
В 13.01.2020 в 21:45, hohserg сказал:Ну допустим даже в пределах string и number. Нужен какой-то тип, который позволяет получить значение any по ключу. Насколько я понимаю, для своего типа нельзя переопределить оператор [].
Разрабы из дискорда действительно помогли.
Надо использовать директиву @luaTable. Не сильно красивое решение (в плане создания таблицы, ведь надо приводить ее к any, т.к. у нее нет этих методов), зато лучше чем полное отсутствие типизации.
Скрытый текст
Транспилируется в
-
1
-
-
@hohserg Похоже, что TypeScript не позволяет использовать в качестве ключа типы отличные от string и number. Я попробую спросить что с этим можно сделать у разработчиков транспилера.
-
@hohserg Исправил в новой версии @opct/openos 0.0.8
component.list() теперь исправно работает как генератор.
Аргументы командной строки можно получить из глобальной переменной args.
Кстати, рекомендую изучить эту страницу, чтобы избежать возможных проблем совместимости Lua с TypeScript функциями.
Позже я опишу этот нюанс и нововведения в гайде.
-
1
-
-
2 минуты назад, hohserg сказал:Это таблица, которая имеет метатаблицу, благодаря которой появляется функция итератора.
Т.е. надо как-то типизировать метатаблицы у таблиц
Ага, вижу. Это не сложно типизировать, сейчас исправлю.
-
@hohserg Это недоработка в декларациях. Я могу ее исправить, но мне нужно понять почему там возвращается функция (Я копировал эти типы из документации). Это какой-то итератор? Или это все-таки таблица?
-
20 минут назад, hohserg сказал:Как получить rest args модуля или аргументы запуска программы?
--lua print(select(2, ...)) local rest_args={...} print(rest_args)
Какой TS-эквивалент у кода выше?
Я думаю, что верхнюю конструкцию можно встроить в репозиторий с тайпингами, чтобы не писать ее каждый раз вручную. Я сделаю это чуть позже.
-
1
-
-
10 часов назад, hohserg сказал:OC-TS: Init не добавляет в воркспейс декларации https://github.com/Exeteres/opc-types
Это баг или нужно отдельно ставить?
Должен был установиться вместе с typescript-to-lua, проверь нет ли ошибок при выполнении команды. (у меня на Windows 10 все ок)
require пока не типизирован, но его тоже можно расширить, если это будет нужно.
Для импорта в тайпскрипте используются следующие конструкции:
Скрытый текст1. Импорт всего содержимого модуля (аналог require)
2. Импорт отдельных функций, методов и тд
-
1
-
-
В 10.01.2020 в 18:16, NEO сказал:Лучше вима ничего не придумали.
А я и не спорю
-
Идея конечно замечательная, но с нуля строить подобную систему очень сложно и долго, и самое главное, нет необходимости, ведь эта программа должна работать в окружении полноценной операционной системы и есть много уже готовых решений, которые можно расширить.
В данном случае, центром этой системы должен быть редактор кода, а единственной интеграцией - связь между этим редактором и OpenComputers. Все остальные интеграции (git, pastebin) должны быть реализованы независимо от OpenComputers.
Я сейчас говорю про прекрасный редактор VSCode, которые очень просто расширяется с помощью плагинов. Он поставляется со встроенной поддержкой git (а вот и первая интеграция), плагинов для pastebin тут конечно немного, при желании можно будет написать свой:
Скрытый текст
А теперь про связь с OpenComputers. Она тоже может быть реализована собственным плагином. Например, мое расширение для работы с TypeScript, имеет функцию автоматического поиска и подключение в редактор жестких дисков из игры и эмулятора. Тоже самое можно реализовать и для обычного lua. Можно также написать клиент для OpenComputers, который через интернет карту обменивается данными с VSCode. Так можно отправлять из редактора код и выполнять в игре (например, на серверах, когда у игроков нет прямого доступа к диску) или даже отлаживать его (клиент может отправлять результат выполнения кода, включая информацию об ошибках и прочие данные, которые можно отобразить в редакторе).
-
1
-
-
9 часов назад, hohserg сказал:Осваиваю TypeScript. Возник такой вопрос: может ли транслятор сгенерировать декларации(definitions) для файлов, которые че-то экспортируют, т.е. являются библиотеками? Например, если я написал библиотеку, опубликовал, то было бы удобно распространять .d.ts-файлы для нее
Да, это возможно с помощью флага declaration в compilerOptions файла tsconfig.json.
-
1
-
-
В 07.01.2020 в 18:34, hohserg сказал:Watch и не должен завершаться. Он будет смотреть за изменением исходных файлов и компилировать их.
Попробуй нажать кнопку обновить вверху панели с файлами. VSCode пока не может следить за изменениями по ссылкам.
-
1
-
-
В 07.01.2020 в 17:12, hohserg сказал:Добавил. Открыть настройки можно сочетанием Ctrl + ,
Относительные пути будут разрешены относительно домашней папки (в винде C:\Users\username). Абсолютные модифицированы не будут.
-
-
В 07.01.2020 в 02:15, hohserg сказал:Попробовал. OC-TS: Mount че-то не работает - ввожу команду и ничего не происходит. Как выбрать назначение ссылки для dist?
~~~
Может, я че-то не так делаю? Раньше не юзал VSCode
Я нашел ошибку (и даже не одну). Я использовал неправильный оператор (return вместо continue), и поэтому он выходит из команды, если хотя бы одно сохранение не содержит папку opencomputers. У меня было только одно сохранение, поэтому я сразу не нашел этот баг.
Я исправил его и опубликовал новую версию.
-
-
1 минуту назад, hohserg сказал:Может конечно. В этом случае плагин ide должен разместить локально свой сервис, к которому программа в игре будет обращаться в случае ошибки
Да, так и планировалось. При запуске отладчика плагин будет встраивать в запускаемый файл кусок кода, который устанавливает обработчики ошибок и подключается к серверу. Я правда не знаю какой протокол для этого использовать: можно http, а можно tcp или вебсокеты (если в opencomputers они есть). Тогда можно будет отправлять данные в оба направления, например, чтобы уведомить программу продолжить работу после остановки на брейкпоинте или перезапустится.
-
3 минуты назад, hohserg сказал:нужно как-то получить соответствие TypeScript-коду
Да, все так. Я надеюсь, что с этим разберутся карты кода.
Кстати, есть идея касательно транспорта. Можно использовать интернет карту. Она же может совершать запросы к localhostу?
-
1
-
-
В 06.01.2020 в 00:17, hohserg сказал:А есть плагин для VSCode, чтобы сетапать воркспейс нажатием одной кнопки?
Небольшая демонстрация.
Скрытый текст
Надо исправить некоторые недочеты и добавить поддержку Linux.
Потом буду разбираться как загрузить его в каталог расширений и обновлю гайд.
-
1
-
-
В 06.01.2020 в 16:04, hohserg сказал:А какие отладочные данные требуются?
Самые простые: уведомление VSCode об ошибке или брейкпоинте и передача строки, в которой произошла остановка. Если произошла ошибка, можно показать ее текст в редакторе.
Сложнее: передача состояния переменных из области видимости того места, где произошла остановка. Это уже более полезная информация, которая позволит не использовать print для отладки. Добавить стек вызовов и это уже можно будет назвать полноценным отладчиком.
-
В 06.01.2020 в 00:17, hohserg сказал:А есть плагин для VSCode, чтобы сетапать воркспейс нажатием одной кнопки?
Хорошая идея, я об этом даже не подумал. Можно также добавить в этот плагин автоматический поиск дисков (папки .minecraft\saves\xxx\opencomputers) и их подключение. Я займусь его написанием, не думаю что это слишком сложно.
В 06.01.2020 в 01:11, Fingercomp сказал:На тайпскрипте я, конечно, не писал, но пробовал MoonScript. Это такой язык, который транспилируется в Lua. У него тоже есть классы, сахара всякие. Но я на нём больше писать не хочу.
Выхлопной код получается страшный. Что не сильно способствует дебагу. А ещё он неоптимален. В том числе по размеру получающегося скрипта, и минификатор не сильно помогает.
Здесь, видимо, всё то же. Так что для опенкомпов будет проще всё же писать на Lua.
Я видел MoonScript в соседней теме. Он конечно хорош, учитывая что был создан специально для lua, но разве в нем есть статический анализ? Это хоть и не спасает от ошибок в рантайме, но позволяет уберечь программиста от отладки очень глупых ошибок и опечаток и обнаружить их еще до компиляции (или во время нее). Что касается отладки - действительно, код не сильно читаем. Я пока не знаю, насколько это возможно, но хотелось бы иметь отладчик. Технически, транспилер поддерживает карты кода, что позволяет сопоставить исходный typescript и сгенерированный lua код. Я пока не нашел полноценного lua отладчика для opencomputers, но думаю что он есть. В крайнем случае можно использовать библиотеку debug.
Осталось лишь найти транспорт между игрой и VSCode, чтобы доставлять отладочные данные и можно будет написать отладчик как плагин для VSCode.
-
1
-





Программа не работает
в Помогите найти ошибку
Опубликовано: · Изменено пользователем Exeteres
И с этим нельзя поспорить. А все потому что JavaScript и Lua имеют некоторые различия, которые могут просто ввести в заблуждение.
Я добавил в гайд раздел с самыми важными отличиями и особенностями транспилера. Если я что-то пропустил, буду рад дополнить.