Сохранение функции со списком аргументов

Published
» Способ реализации: 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


Views: 1 140

Clamp #1 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Vlod:
Иногда может понадобиться сохранить определенный список аргументов функции, чтобы потом вызвать её с нужными параметрами.
Не смог придумать ни одного кейса, для которого это было бы нужно, если честно.
Vlod #2 - 1 year ago 0
Голосов: +0 / -0
Clamp:
Не смог придумать ни одного кейса, для которого это было бы нужно, если честно.
Зачем определять аргументы в одном блоке, а вызывать в другом? Например, для отложенного старта, + функциональный стиль
quq_CCCP #3 - 1 year ago 0
Голосов: +0 / -0
Vlod #4 - 1 year ago 2
Голосов: +2 / -0
quq_CCCP:
Сохранять аргументы в объект, и возможность передавать аргументы в функцию - это не одно и то же. Более того, оно "требует мемхак_второй_версии"
Jack-of-shadow #5 - 1 year ago (изм. ) 1
Голосов: +1 / -0
Можно еше фильтры использовать сохраняя их в хеш.
Единственное передача атрибутов там не встроена, для этого используются глобалки. Функции для передачи я расширяю по мере надобности, так как обычно хватает индекса игрока.
» типо того
 define RunCodeI    (i,s)       = {CodeI = i; RunCode(s) }
 define RunCodeIU   (i,u,s)     = {CodeI = i; CodeU = u; RunCode(s) }
 define RunCodeD    (i,d,s)     = {CodeI = i; CodeD = d; RunCode(s) }
 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) }
 define RunCodeUXYD (u,x,y,d,s) = {CodeU = u; CodeX = x; CodeY = y; CodeD = d; RunCode(s) }

Vlod:
А, так у тебя тоже фильтры только не через хеш? Тогда это даже шустрее будет
Msey #6 - 1 year ago 0
Голосов: +0 / -0
Чем бы дитя не тешилось..
Сомнительный функционал в рамках варкрафта
Doc #7 - 1 year ago 1
Голосов: +1 / -0
Не нужно при наличии луа
Vlod #8 - 1 year ago 0
Голосов: +0 / -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) }
Да я тоже так писал) Но как я это представлю людям, мол, описывайте дефайны сами при появлении новой комбинации аргументов) А тут вроде как одна строчка под необходимым методом, и больше не паришься
Doc #9 - 1 year ago 0
Голосов: +0 / -0
Msey, Doc, никто не заставляет пользоваться этим.
Что не делает это менее ненужным
Vlod #10 - 1 year ago 0
Голосов: +0 / -0
Doc:
Что не делает это менее ненужным

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

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

Наконец, подскажите вы, где в луа встроена система сохранения параметров с функцией в объект?
GetLocalPlayer #11 - 1 year ago 0
Голосов: +0 / -0
Может вы скажите, какие есть удобные решения по работе с lua сейчас?
Только Warcraft - VSCode. Есть еще нечто с именем Ceres, но у меня не работает.
Doc #12 - 1 year ago (изм. ) 0
Голосов: +0 / -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
Vlod #13 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Doc,
По поводу подсветки запуска и билда - просил готовые решения или рабочие мануалы.
По поводу парсера - это неюзабельно для невысококвалифицированной части аудитории, почему-то ничего не сказали по поводу поддержки старых диалектов.
Внимательно читаем www.lua.org/pil/6.1.html
Можете оставить этот юмор при себе? Или вы предлагаете для каждой функции вручную описывать замыкания? Эта наработка как раз избавляет от этого разработчика, делая всё в одну строку. Более того, замыкания в луа несколько иначе интерпретируются в jass, чем тут, стоило прежде обратить на это внимание.

Прошу экономить время, ваше и моё. Вы же прекрасно понимаете, чем отличается:
Я использую обычный .bat скрипт, в котором одна строка копирует файл карты, другая вставляет в нее мой код (с помощью MPQEditor.exe), а третья запускает варкрафт с этой картой.
от
скиньте подробные мануалы, чтобы можно было их сравнить с предыдущими и проверить работоспособность на 1.26 и 1.31.
Doc #14 - 1 year ago (изм. ) 1
Голосов: +1 / -0
Можете оставить этот юмор при себе? Или вы предлагаете для каждой функции вручную описывать замыкания? Эта наработка как раз избавляет от этого разработчика, делая всё в одну строку. Более того, замыкания в луа несколько иначе интерпретируются в 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
Vlod #15 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Обращаюсь к аудитории. Посмотрите на этот комментарий, а теперь - на версию патча.
Логики я здесь, извините, не вижу.

Для тех, кто не понял, на 1.26 нет луа.
Doc #16 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Vlod:
Обращаюсь к аудитории. Посмотрите на этот комментарий, а теперь - на версию патча.
Логики я здесь, извините, не вижу.

Для тех, кто не понял, на 1.26 нет луа.
Для тех, кто не понял, 1.26 - не последний патч. (соответственно делать на нем что-либо здравого смысла нет, патчу почти 9 лет)
Vlod #17 - 1 year ago 0
Голосов: +0 / -0
Что касается обсуждения самого lua тут. Хочу заметить, что на момент задания мной вопроса и получения на него ответа не было такой программы, следовательно не была обновлена эта статья. Также не было и этой и этой статьи и этого заказа. Появление такого обилия ресурсов, а также планомерное увеличение спроса свидетельствует, что предоставленных материалов в ответах было объективно недостаточно.
Doc #18 - 1 year ago 0
Голосов: +0 / -0
Объективно недостаточно для чего? С луа можно было нормально работать в день выхода 1.30
2 комментария удалено
Hate #21 - 1 year ago 0
Голосов: +0 / -0
конвертер жасс->луа был довольно давно, другой,
в этом смысола действительно особо нет, так как на 1.26 оставаться с приближением рефорджа уже не имеет резона
Настроить intellij под луа и варкрафт банально для копирования кода в редактор дело нескольких минут и было уже расписано как
это типа прикольно и все дела только слишком поздно
PT153 #22 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Да при чём тут Lua, наработка на cJass, пишите про качество самой наработки с точки зрения JASS.
Vlod, ресурс можно скрыть.
Doc #23 - 1 year ago 0
Голосов: +0 / -0
Пишу о качестве наработки: "A closure is a poor man’s object; an object is a poor man’s closure". Учитывая что эти кложуры нужно оборачивать в макросы, которые при изменении сигнатуры функции нужно еще и поддерживать, куда-то сохранять, а затем еще и удалять, намного проще вручную создать структуру. Не нужно. Речь о луа была только потому, что там тоже есть кложуры, только их использование во много много раз проще и имеет больше смысла (анонимные функции, например). Тащить подобные костыли в жасс не советую.
Vlod #24 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Данная наработка сделана таким образом, чтобы минимизировать изменение уже существующих синтаксических конструкций, позволяет писать чистые функции. Мы добавляем функционал, которого нет. В том числе для того, чтобы писать такие вещи.