Алгоритмы, Наработки и Способности
Способ реализации:
cJass
Тип:
Наработка
Версия Warcraft:
1.26а

Введение

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

Описание

  • Сохранить аргументы с функцией в объект:
namefunction.save(arg1,arg2...) -> int obj,
где namefunction - имя оригинальной функции,
(arg1,arg2...) - её аргументы.
  • Вызвать:
frun(int obj)
  • Вернуть значения:
namefunction.namepar1, namefunction.namepar2,
где nameparN - имя возвращаемого параметра
  • Удалить (очистить):
fdel(int obj)

---Пример---

function test_1 takes integer a, integer b returns nothing
  test_1.ret(a+1,b-1)
endfunction
//! runtextmacro FUNC2("test_1","integer","integer")
//! runtextmacro RET2("test_1","integer","i1","integer","i2")

function test_2 takes integer a, integer b, real c returns nothing
  printr(a+c,b+c)
endfunction
//! runtextmacro FUNC3("test_2","integer","integer","real")

function MyCode1 takes nothing returns nothing
  integer save = test_1.save(1,5)
  frun(save)
  fdel(save)
  
  save = test_2.save( test_1.i1, test_1.i2, 10. )
  frun(save)
  fdel(save)
endfunction
Выведет:
a+c 12.000; b+c 14.000

Дополнительно

о количестве аргументов
Система легко масштабируется, но с увеличением масштаба тяжело вводить архитектурные изменения. Сжать код не получилось из за словленного бага с define.

Установка

Поддерживаются функции не более чем с 6 аргументами.
Число возвращаемых параметров не более 4.
Список поддерживаемых типов данных
Возможно расширить в любой момент по аналогии.
(string)
(destructable)
(effect)
(integer)
(item)
(lightning)
(multiboard)
(multiboarditem)
(player)
(real)
(rect)
(region)
(timer)
(trigger)
(unit)
Список изменений (02.01.2020)
  • Добавлено введение, описание, дополнительно, установка;
  • Добавлен деструктор. Теперь можно очистить объект-функцию;
  • Исправлена очистка функций, добавлен возврат нескольких значений;
  • Единый деструктор для всех функций. Переход к ExecuteFunc() от ForceEnumPlayers() из-за мультивызовов.

Скопировать папки ProtoClass, SaveFunction.
Скачать:
SaveFunction.w3m
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
17
4 года назад
0
Msey, Doc, никто не заставляет пользоваться этим.

Jack-of-shadow:
Можно еше фильтры использовать сохраняя их в хеш.
Когда увидел в первый раз, был очень впечатлён, и появилась идея как это делать вообще без хеша строк и без самих хештаблиц - с помощью сборки define из textmacro.
А, так у тебя тоже фильтры только не через хеш? Тогда это даже шустрее будет
Запуск тоже через boolexpr, но у потока есть лимит запусков boolexpr-ов, злоупотреблять не стоит. Сейчас для каждой функции собирается личный конструктор и деструктор аргументов. Тут задача - хранить где-то функцию с динамическим диапазоном аргументов каких-либо типов максимально просто.
 define RunCodeXY   (i,x,y,s)   = {CodeI = i; CodeX = x; CodeY = y; RunCode(s) }
 define RunCodeUXY  (u,x,y,s)   = {CodeU = u; CodeX = x; CodeY = y; RunCode(s) }
Да я тоже так писал) Но как я это представлю людям, мол, описывайте дефайны сами при появлении новой комбинации аргументов) А тут вроде как одна строчка под необходимым методом, и больше не паришься
0
29
4 года назад
0
Msey, Doc, никто не заставляет пользоваться этим.
Что не делает это менее ненужным
0
17
4 года назад
0
Doc:
Что не делает это менее ненужным

Может вы скажите, какие есть удобные решения по работе с lua сейчас?
Подсветка, запуск, билд, скиньте подробные мануалы, чтобы можно было их сравнить с предыдущими и проверить работоспособность на 1.26 и 1.31.

Может у вас есть инструмент для преобразования jass кода в lua?
Или, может, есть парсер cjass -> lua, или хотя бы vjass -> lua?
Ведь большое количество проектов были написаны с использованием этих диалектов, есть ли возможность облегчить им переход?

Наконец, подскажите вы, где в луа встроена система сохранения параметров с функцией в объект?
0
17
4 года назад
0
Может вы скажите, какие есть удобные решения по работе с lua сейчас?
Только Warcraft - VSCode. Есть еще нечто с именем Ceres, но у меня не работает.
0
29
4 года назад
Отредактирован Doc
0
Подсветка луа есть в куче редакторов, я использую IntelliJ + EmmyLua, есть VSCode, ZeroBrane, SublimeText, да даже Notepad++.
Запускать можно множеством способов, начиная от копипастинга кода в редактор и запускания прямо оттуда, заканчивая билд системами, такими как github.com/ElusiveMori/ceres-wc3
Я использую обычный .bat скрипт, в котором одна строка копирует файл карты, другая вставляет в нее мой код (с помощью MPQEditor.exe), а третья запускает варкрафт с этой картой.
Многих может шокировать невероятно, но близзард и так уже конвертируют жасс в луа, поэтому такой парсер уже есть в стандартной поставке. Либо этот github.com/actboy168/jass2lua
Другой вариант - xgm.guru/p/wc3/jassnewgenpack-lua#lastpost
Наконец, подскажите вы, где в луа встроена система сохранения параметров с функцией в объект?
Внимательно читаем www.lua.org/pil/6.1.html
0
17
4 года назад
Отредактирован Vlod
0
Doc,
По поводу подсветки запуска и билда - просил готовые решения или рабочие мануалы.
По поводу парсера - это неюзабельно для невысококвалифицированной части аудитории, почему-то ничего не сказали по поводу поддержки старых диалектов.
Внимательно читаем www.lua.org/pil/6.1.html
Можете оставить этот юмор при себе? Или вы предлагаете для каждой функции вручную описывать замыкания? Эта наработка как раз избавляет от этого разработчика, делая всё в одну строку. Более того, замыкания в луа несколько иначе интерпретируются в jass, чем тут, стоило прежде обратить на это внимание.

Прошу экономить время, ваше и моё. Вы же прекрасно понимаете, чем отличается:
Я использую обычный .bat скрипт, в котором одна строка копирует файл карты, другая вставляет в нее мой код (с помощью MPQEditor.exe), а третья запускает варкрафт с этой картой.
от
скиньте подробные мануалы, чтобы можно было их сравнить с предыдущими и проверить работоспособность на 1.26 и 1.31.
1
29
4 года назад
Отредактирован Doc
1
Можете оставить этот юмор при себе? Или вы предлагаете для каждой функции вручную описывать замыкания? Эта наработка как раз избавляет от этого разработчика, делая всё в одну строку. Более того, замыкания в луа несколько иначе интерпретируются в jass, чем тут, стоило прежде обратить на это внимание.
Юмор? То, что ты реализовал - это блеклая копия замыканий. Что значит описывать вручную? Прошу экономить время. Я попросил прочитать внимательно, ты видимо прочитал невнимательно или твое понимание какое-то альтернативное от правильного.
По поводу подсветки запуска и билда - просил готовые решения или рабочие мануалы.
Я дал тебе ссылки на готовые решения с рабочими мануалами.
По поводу парсера - это неюзабельно для невысококвалифицированной части аудитории
А твое решение расчитано на начинающих?
Я не собираюсь скидывать подробные мануалы по batch скриптам, их полно на первой странице гугла. Вся нужная информация для поиска есть в моем ответе.
Для людей, которые пытаются выглядеть особо умными и знающими, но по факту таковыми не являющимися и пишущими бред вроде "замыкания в луа несколько иначе интерпретируются в jass" (в jass замыканий нет, это высказывание де факто смысла не имеет), привожу пример НЕ требующий никаких библиотек, менеджмента ресурсов или запуска мусорных макросов (советую сравнить с примером в основном посте):
function test0()
  print("test0")
end

function test6(a, b, c, d, e, f)
  print(a,b)
  print(c,d)
  print(e);print(f)
  print(test6)
end

function MyCode()
  local save = function() test0() end
  save()
  
  save = function() test6(1.1, 2.1, 3, 4, "_5", "_6") end
  save()
end
0
17
4 года назад
Отредактирован Vlod
0
Обращаюсь к аудитории. Посмотрите на этот комментарий, а теперь - на версию патча.
Логики я здесь, извините, не вижу.

Для тех, кто не понял, на 1.26 нет луа.
0
29
4 года назад
Отредактирован Doc
0
Vlod:
Обращаюсь к аудитории. Посмотрите на этот комментарий, а теперь - на версию патча.
Логики я здесь, извините, не вижу.

Для тех, кто не понял, на 1.26 нет луа.
Для тех, кто не понял, 1.26 - не последний патч. (соответственно делать на нем что-либо здравого смысла нет, патчу почти 9 лет)
0
17
4 года назад
0
Что касается обсуждения самого lua тут. Хочу заметить, что на момент задания мной вопроса и получения на него ответа не было такой программы, следовательно не была обновлена эта статья. Также не было и этой и этой статьи и этого заказа. Появление такого обилия ресурсов, а также планомерное увеличение спроса свидетельствует, что предоставленных материалов в ответах было объективно недостаточно.
0
29
4 года назад
0
Объективно недостаточно для чего? С луа можно было нормально работать в день выхода 1.30
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.