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

Krutoy

Гуру
  • Публикации

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

  • Посещение

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

    72

Krutoy стал победителем дня 21 февраля

Krutoy имел наиболее популярный контент!

Репутация

1 169 Очень хороший

Krutoy

  • Звание
    Бывалый

Информация

  • Пол
    Не определился

Посетители профиля

Блок посетителей профиля отключен и не будет отображаться другим пользователям

  1. Переписал README на русский язык. Смотрите тут или в 0м сообщении:
  2. Один из игроков в мой модпак сделал видео по тому как сделать убивающего робота.
  3. Бутылочка - Time In The Bottle из мода Random Things Рецепт я сделал с помощью мода CraftTweaker. Я ведь разрабатываю свой модпак и могу делать какие угодно рецепты.
  4. Записал небольшой гайд о простом функционале
  5. Например то, что будет очень сложно засунуть в EEPROM настоящий парсер со своим мощным синтаксисом
  6. Ну да, в этом и суть. Я придумываю правила сам. Вот только я не пишу свой парсер. Я придерживаюсь синтаксиса Луа, а поэтому, не могу сделать из присваивания выражение.
  7. Мне кажется, делать "читаемый код" тут бессмысленно. Это как когда ты был в школе - тебе объяснили что такое знак +. Там не было никаких SPA схем или "человеко читаемый код". Может, показали пару-тройку яблок что бы объяснить что такое сложение. Думаю так же и здесь. Пару десятков раз заходишь в справочник что какой знак делает, потом привыкаешь. Да и я если честно, сам не совсем понимаю, как делать "человеко-читаемый код" в функциональном программировании. Например, есть оператор "apply" или по-русски "применение". В моем коде он выглядит как f/n, где f - функция, n - число или boolean. Результат будет выглядеть вот так: -- f/n function(...) return f(n, ...) end А теперь еще раз используем "применение": -- f/a/b function(...) return (function(...) return f(a, ...) end)(b, ...) end У меня если честно мозг устает такой "читаемый код" делать. 😅
  8. Цель этого трюка - сократить количество символов в коде. Пример из реального кода: У нас есть точка из Навигатора дрона P=navigation.findWaypoints(300) Дальше по коду, мы полетим к этому вейпоинту, подождем, а затем выполним его название drone.move(table.unpack(P.position)) while drone.getOffset() > 1 do sleep(1) end run(P.label) В моем сокращении это всё выглядит так: P=i/Nf300ⓡDm^Pp,s/1~'Dg!>1',_(Pl) Допустим, я сделаю ту функцию function _P(v) P = v; return P end Тогда сокращение будет выглядить так: _P(i/Nf300),Dm^Pp,s/1~'Dg!>1',_(Pl) И это только увеличило количество символов на +1 😃
  9. Если кто то читает эту тему, подскажите - как сделать присваивание внутри выражения? Например, есть вот такой код: _1_ function f() return _2_ end Я могу менять только _1_ и _2_. Я хочу что бы в _2_ было присваивание и тут же использование этой переменной. Например a=robot.move -- присваивание not a(3) and robot.turn(true) -- выражение Пока надумалось только такое решение - сделать функцию, которая будет присваивать значение глобальной переменной. Но этот вариант выглядит криво function _a(v) a = v end function f() return _a(robot.move), a(3) end
  10. В общем, похоже вырисовывается в какой-то мере стабильно работающий код. Пока вся документация на английском: https://github.com/Krutoy242/lostuser В общем, я сохранил правила укорачивания и добавил больше функций между таблицами и функциями. Приведу пример дрона, который носит предметы между точками. Компоненты: Инвентарь, Контроллер инвентаря Имя дрона: P=i/Nf300ⓡDm^Pp,s/1~'Dg!>1',_(Pl) Описание каждой части имени: Nf300: Выполняет navigation.findWaypoints(300). Это никакое заранее указанное сокращение. Большая буква - это сокращение, которое получают все компоненты. navigation -> N, inventory_controller -> I и так далее. i/Nf300: Здесь используется единственная предустановленная переменная i. i = порядковый индекс текущего цикла программы, начиная с нуля. i / table - специальная функция "Получить индекс по модулю" или t[i % #t + 1]. Все эти функции, которые есть математические операторы над таблицами, есть в документации. По смыслу мы просто пробегаем каждый цикл по следующему вейпоинту. P=i/Nf300: Просто записываем в глобальную переменную P наш вейпоинт. Локальные переменные не могут сокращаться, поэтому мы используем глобальную. А еще, если буква будет большая, мы сможем сократить точку далее. ⓡ: просто один символ который будет заменен на return . Приму советы как избежать таких замен, что бы сохранить чистый Lua код 🙂 Dm^Pp: вызывает drone.move(table.unpack(P.position)). Тут должно быть просто. Dm => D.m => drone.m => drone.move. В документации по ссылке выше перечислены все операторы, и там написано что если функцию (drone.move) возвести в степень таблицы (p.position) то мы получим вызов функции с раскрытием таблицы в параметры. s/1~'Dg!>1' => while drone.getOffset() > 1 do sleep(1) end. Здесь символ ! заменяется на () _(Pl): Загрузить P.label как Lua код. Эта функция будет загружена и выполнена. Точки называются _'Dsk0'~4 и _'Dsel(k)Dd(0)'~4 соответственно. Первая сосет 4 раза, вторая выбирает каждый из 4х слотов и поочереди их выбрасывает.
  11. Продолжаю программировать. Понял что моя "труба" на самом деле называется "map". И теперь переписал код, что бы оператор map был через "*". Еще, "/" это `filter(v)`, а "%" это оператор "reduce(a,b)" T = q({{index=1},{name='n2'},{index=3}}) print(T*'v.i'/'v'%'a+b') -- 4 Осталось понять, что должно происходить, если мы делаем фильтр в таблицу или фильтр в число.
  12. Ок, тогда я могу делать трубу в строку Вот, чистый луа код без замены символов Tg()|'a1.tr()' Превращается в (еще оборачивается в pcall что бы ошибок не было при итерации) for k,v in pairs(trade.getTrades()) do v.tr() end
  13. А machine.lua есть на EEPROM ? Если да, то это досада =(( UPD: Нашел... Печалька https://github.com/MightyPirates/OpenComputers/blob/master-MC1.12/src/main/resources/assets/opencomputers/lua/machine.lua#L730
  14. Я только что понял, что я могу изменять метатаблицы строк! Это значит, что я могу добавить методы к строкам, тем самым полностью превратив имя робота в луа-программу, без подстанов и замен. Например, я могу добавить __bnot к строке, что будет ее загружать и превращать в функцию. getmetatable('').__bnot=function(s)return load('return '..s) end print((~'5*5')()) -- 25
  15. Ок, вот мои наработки по теме: https://gist.githubusercontent.com/Krutoy242/1f18eaf6b262fb7ffb83c4666a93cbcc Документацию напишу позже. Пока, как я и говорил, робот (или дрон!) умеет выполнять свое имя как Луа-код. Но к тому же, он может всё сокращать до 1-2 символов. Например, вот такая строка сторгует всё что есть у жителя: ~:Tg(){?!v{tr}} А вот мега программа в 54 символ для дрона, который носит предметы из одного вейпоинта к другому: Dm(tb.u(Nf(300)[a++%2+1].p))s(3)~#{Dsel(i)Dd(0)Dsu(0)} В этом примере есть такие сокращения: a++ это продвинутая версия a=a+1, только она работает даже если а==nil s(3) расшифруется как sleep(3) ~#{BODY} получится for i=1, (R or D).inventorySize() do BODY end Еще, я добавил крутые фичи связанные с "трубами" - как в лямбда программировании, когда мы можем скомпоновать функцию, которая будет передавать результат своей работы в другую функцию. Но пока не придумал как ими пользоваться. Главная фишка это утилизировать битовые операции. Я сделал такое: a|b превращается в function(c) return b(a(c)) end. Но оказалось, что это почти бессмысленно, если мы не можем получить ключ\значение из цикла. В итоге, я уже могу написать вот такую функцию: _4|(Dsel|Dd&0) Получится вот так (примерно): for k,v in pairs{1,2,3,4} do (function() return D.drop(0) end)(D.select(v,k)) end Но как то криво всё равно. Не элегантно. Но уже можно пользоваться. javaw_0VdCQylZec.mp4
×
×
  • Создать...