Перейти к содержимому

Exeteres

Пользователи
  • Публикации

    26
  • Зарегистрирован

  • Посещение

  • Победитель дней

    8

Сообщения, опубликованные пользователем Exeteres


  1. 22 часа назад, eu_tomat сказал:

    Зато могут появиться другие)

    И с этим нельзя поспорить. А все потому что JavaScript и Lua имеют некоторые различия, которые могут просто ввести в заблуждение.

    Я добавил в гайд раздел с самыми важными отличиями и особенностями транспилера. Если я что-то пропустил, буду рад дополнить.


  2. Удалось реализовать простой отладчик для 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

  3. Как я понял, в результате взаимодействия с пользователем вовзращается таблица, содержащая все указанные данные. В последнем примере она записана в переменную data. Ничего не мешает использовать в коде поля этой таблицы: data[1], data[2] ... Если очень хочется, их можно будет перезаписать в переменные:

    local text = data[1]

    Или можно использовать table.unpack:

    local text, fileFormat, sexOrientation = table.unpack(data)

     

    Кстати, как сказал сам автор, она уже устарела и рекомендуется использовать библиотеку GUI.


  4. 1 час назад, hohserg сказал:

    Форкнул opc-types, добавил декларации для AE2 и OpenPeripheral. opc-types возможно тестить не таская .d.ts в проект вручную?

    В репозитории есть папка examples. Можно тестировать в ней. (там есть npm команда build-examples) Если писать примеры достаточно аккуратно, лучше их там оставить.

    • Нравится 1

  5. 29 минут назад, hohserg сказал:

    Есть готовый класс https://github.com/TypeScriptToLua/TypeScriptToLua/blob/master/src/lualib/declarations/luatable.d.ts

    И его вроде нужно юзать так ```LuaTable<{},any>```

    Только никак не пойму: как его импортировать? 

    Скорее всего он не включен в состав npm пакета.

    Я могу лишь добавить его к тайпингам opencomputers, хотя это и не логично.


  6. В 13.01.2020 в 21:45, hohserg сказал:

    Ну допустим даже в пределах string и number. Нужен какой-то тип, который позволяет получить значение any по ключу. Насколько я понимаю, для своего типа нельзя переопределить оператор []. 

    Разрабы из дискорда действительно помогли.

    Надо использовать директиву @luaTable. Не сильно красивое решение (в плане создания таблицы, ведь надо приводить ее к any, т.к. у нее нет этих методов), зато лучше чем полное отсутствие типизации.

    Скрытый текст

    image.png.7064642e5d5d83863cc1df1c095e38b6.png

     

    Транспилируется в

    image.png.ed69a3f11882b92a472ff7561585bb27.png

     

    • Нравится 1

  7. @hohserg Исправил в новой версии @opct/openos 0.0.8

    component.list() теперь исправно работает как генератор.

    image.png.4be40e0800e7c16afbd2adad8b245ffd.png

     

    Аргументы командной строки можно получить из глобальной переменной args.

    image.png.c680796cd75a5e3a7ec54551e3c54fc8.png

     

    Кстати, рекомендую изучить эту страницу, чтобы избежать возможных проблем совместимости Lua с TypeScript функциями.

    Позже я опишу этот нюанс и нововведения в гайде.

    • Одобряю 1

  8. 2 минуты назад, hohserg сказал:

    Это таблица, которая имеет метатаблицу, благодаря которой появляется функция итератора.

    Т.е. надо как-то типизировать метатаблицы у таблиц 

    Ага, вижу. Это не сложно типизировать, сейчас исправлю.

    image.png.0b8014d73f157ec4a9d7106c3f25b7b5.png


  9. @hohserg Это недоработка в декларациях. Я могу ее исправить, но мне нужно понять почему там возвращается функция (Я копировал эти типы из документации). Это какой-то итератор? Или это все-таки таблица?


  10. 20 минут назад, hohserg сказал:

    Как получить rest args модуля или аргументы запуска программы?

    
    --lua
    print(select(2, ...))
    local rest_args={...}
    print(rest_args)

    Какой TS-эквивалент у кода выше?

    image.png.ab1a01e6e06d23174365f41d68c3c12f.png

     

    Я думаю, что верхнюю конструкцию можно встроить в репозиторий с тайпингами, чтобы не писать ее каждый раз вручную. Я сделаю это чуть позже.

    • Спасибо 1

  11. 10 часов назад, hohserg сказал:

    OC-TS: Init не добавляет в воркспейс декларации https://github.com/Exeteres/opc-types

    Это баг или нужно отдельно ставить? 

      

    image.png.7503ef0cb3e89130dcfeceb0e5d79eb6.png В ide типы не появились даже когда установил вручную

    Должен был установиться вместе с typescript-to-lua, проверь нет ли ошибок при выполнении команды. (у меня на Windows 10 все ок)

     

    require пока не типизирован, но его тоже можно расширить, если это будет нужно.

    Для импорта в тайпскрипте используются следующие конструкции:

    Скрытый текст

    1. Импорт всего содержимого модуля (аналог require)

    image.png.dde6379bc8ab82fea97f5a1966c8e018.png

     

    2. Импорт отдельных функций, методов и тд

    image.png.b114cd4da22a6f15f30252bf87086e62.png

     

    • Спасибо 1

  12. Идея конечно замечательная, но с нуля строить подобную систему очень сложно и долго, и самое главное, нет необходимости, ведь эта программа должна работать в окружении полноценной операционной системы и есть много уже готовых решений, которые можно расширить.

    В данном случае, центром этой системы должен быть редактор кода, а единственной интеграцией - связь между этим редактором и OpenComputers. Все остальные интеграции (git, pastebin) должны быть реализованы независимо от OpenComputers.

    Я сейчас говорю про прекрасный редактор VSCode, которые очень просто расширяется с помощью плагинов. Он поставляется со встроенной поддержкой git (а вот и первая интеграция), плагинов для pastebin тут конечно немного, при желании можно будет написать свой:

    Скрытый текст

    image.png.e5018fba268ab02092d2ff9dd2eb66f0.png

     

    А теперь про связь с OpenComputers. Она тоже может быть реализована собственным плагином. Например, мое расширение для работы с TypeScript, имеет функцию автоматического поиска и подключение в редактор жестких дисков из игры и эмулятора. Тоже самое можно реализовать и для обычного lua. Можно также написать клиент для OpenComputers, который через интернет карту обменивается данными с VSCode. Так можно отправлять из редактора код и выполнять в игре (например, на серверах, когда у игроков нет прямого доступа к диску) или даже отлаживать его (клиент может отправлять результат выполнения кода, включая информацию об ошибках и прочие данные, которые можно отобразить в редакторе).

    • Одобряю 1

  13. 9 часов назад, hohserg сказал:

    Осваиваю TypeScript. Возник такой вопрос: может ли транслятор сгенерировать декларации(definitions) для файлов, которые че-то экспортируют, т.е. являются библиотеками? Например, если я написал библиотеку, опубликовал, то было бы удобно распространять .d.ts-файлы для нее

     

    Да, это возможно с помощью флага declaration в compilerOptions файла tsconfig.json.

    • Спасибо 1

  14. В 07.01.2020 в 18:34, hohserg сказал:

    Запускаю таску watch, транслированный файл появляется(чекнул через проводник), но в VSCode не отображается, таска watch не завершается 

    image.png.c1821530cee3f59fa9c62f8cb5e9dabf.png

     

    image.png.c50dc763166e3e003efa41785b2fea91.png

    Watch и не должен завершаться. Он будет смотреть за изменением исходных файлов и компилировать их.

     

    Попробуй нажать кнопку обновить вверху панели с файлами. VSCode пока не может следить за изменениями по ссылкам.

    image.png.7444ee1998cd3d4f2e8d14bc17b712be.png

    • Нравится 1

  15. В 07.01.2020 в 17:12, hohserg сказал:

    image.png.a1a48cbdfae11eb0db05691d259e7801.png

    Сохранения у мя лежат в %AppData%\opencomputers\saves\, а не в %AppData%\.minecraft\saves\

    Можно вынести это в конфигурацию куда-нить?

    Добавил. Открыть настройки можно сочетанием Ctrl + ,

    image.png.fac6e1e5ac23bc4266aa7cabc06385c4.png

     

    Относительные пути будут разрешены относительно домашней папки (в винде C:\Users\username). Абсолютные модифицированы не будут.


  16. 1 минуту назад, hohserg сказал:

    image.png.a1a48cbdfae11eb0db05691d259e7801.png

    Сохранения у мя лежат в %AppData%\opencomputers\saves\, а не в %AppData%\.minecraft\saves\

    Можно вынести это в конфигурацию куда-нить?

    Да, можно сделать опцию. Так и сделаю.

    • Нравится 1

  17. В 07.01.2020 в 02:15, hohserg сказал:

    Попробовал. OC-TS: Mount че-то не работает - ввожу команду и ничего не происходит. Как выбрать назначение ссылки для dist?

    ~~~ 

    Может, я че-то не так делаю? Раньше не юзал VSCode

    Я нашел ошибку (и даже не одну). Я использовал неправильный оператор (return вместо continue), и поэтому он выходит из команды, если хотя бы одно сохранение не содержит папку opencomputers. У меня было только одно сохранение, поэтому я сразу не нашел этот баг.

    Я исправил его и опубликовал новую версию.


  18. 1 минуту назад, hohserg сказал:

    Может конечно. В этом случае плагин ide должен разместить локально свой сервис, к которому программа в игре будет обращаться в случае ошибки

    Да, так и планировалось. При запуске отладчика плагин будет встраивать в запускаемый файл кусок кода, который устанавливает обработчики ошибок и подключается к серверу. Я правда не знаю какой протокол для этого использовать: можно http, а можно tcp или вебсокеты (если в opencomputers они есть). Тогда можно будет отправлять данные в оба направления, например, чтобы уведомить программу продолжить работу после остановки на брейкпоинте или перезапустится.


  19. 3 минуты назад, hohserg сказал:

    нужно как-то получить соответствие TypeScript-коду

    Да, все так. Я надеюсь, что с этим разберутся карты кода.

    Кстати, есть идея касательно транспорта. Можно использовать интернет карту. Она же может совершать запросы к localhostу?

    • Нравится 1

  20.  

    В 06.01.2020 в 00:17, hohserg сказал:

    А есть плагин для VSCode, чтобы сетапать воркспейс нажатием одной кнопки?

    Небольшая демонстрация.

    Скрытый текст

    ici-RMCx-RWf.gif

     

    Надо исправить некоторые недочеты и добавить поддержку Linux.

    Потом буду разбираться как загрузить его в каталог расширений и обновлю гайд.

    • Одобряю 1

  21. В 06.01.2020 в 16:04, hohserg сказал:

    А какие отладочные данные требуются?

    Самые простые: уведомление VSCode об ошибке или брейкпоинте и передача строки, в которой произошла остановка. Если произошла ошибка, можно показать ее текст в редакторе.

    Сложнее: передача состояния переменных из области видимости того места, где произошла остановка. Это уже более полезная информация, которая позволит не использовать print для отладки. Добавить стек вызовов и это уже можно будет назвать полноценным отладчиком.


  22. В 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
×
×
  • Создать...