Ок, вот мои наработки по теме:
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