Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий

Viнt@rь,

  Цитата
вот почему ты ограничиваешь себя стандартным обьемом для сохраняемых данных,

Да потому что:

а) объем одной переменной больше 8кб - хрень полная, ошибка проектирования и с этим точно что-то надо делать.

б) потому что подключение чего либо - танцы с бубном и вообще навешивание приблуд на игру.

в) для конечного пользователя это все не нужно - чем меньше костылей подставляем, тем лучше (как пример, конфигуратор в ОГСЕ, например, или в других модах).

г) использование костылей резко суживает портабельность решения. Не смогут те, у кого нет в моде такой приблуды, использовать его. Смысл тогда?

Это все имхо.

Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Monnoroch,

  Цитата
Ситуация простая: некий мододел захотел на непися повесить поведение при неком скриптовом событии - например при выбросе. А выброс, так как наша система работает вокруг слот-сигнальной модели, генерирует сигнал. Ну что делает мододел - подписывает слот на сигнал.

А теперь другой мододел расщедрился и хочет подписать всех сталкеров на это поведение но не знает что один уже подписан. Вот пожалуйста, двойное подписываени.

...

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

Всё-таки правильный ход - это найти где подписываем одного сталкера и убрать этот фрагмент и оставить более общий. Это собственно и есть процесс совмещения модов. Возник конфликт, а этот ассерт помогает его определить и разрешить.

 

И что таки мешает тебе добавить трёхстрочную обёртку, преодолевающую это ограничение? Я бы не рекомендовал таким пользоваться, но это не великое дело - написать эти три строки для себя и использовать.

Изменено пользователем malandrinus
  Полезный утиль (Показать)
Ссылка на комментарий
  Цитата
Если можно, то я для себя сам решу, завязывать мне или нет. ок?

Ты не понял, я имел ввиду что Я завязываю про ассерты. Продолжать ли ТЕБЕ обсуждение, дело твое, мне какая разница?

Хотя, перечитав свой пост, на самом деле может быть воспринято двусмысленно.

 

Я в любом случае был неправ и грубить не имел права. Прошу прощения.

Malandrinus

Изменено пользователем malandrinus
Ссылка на комментарий

Опять у вас начался спор о фломастерах. Тут просто конфликт различных взглядов на разработку. Я например поддерживаю malandrinus'a т.к. считаю что лучше я сейчас, в процессе разработки, найду узкое место которое может приводить к вылетам/лагам/переполнениям/просто к ненужным вызовам, чем я потом буду искать эти места. Но опять же это просто разные взгляды и все

Freedom

Ссылка на комментарий

malandrinus,

  Цитата
убрать этот фрагмент и оставить более общий

Предположим общий включается на первый выброс и после выключается, а частный должен работать всю игру.

В добавок, в данном случае три строки не помогут: надо отписать общий случай но сохранить частный. То есть соблюдать вложенность.

Я, может, пытаюсь придумать искусственный случай, но в самом деле, кто знает, как будут использовать возможность подписки? Я любитель общих решений :)

И не любитель лезть руками в чужой код, неблагодарное это занятие, может там на четном количестве ошибок в знаке все держится?

Изменено пользователем Monnoroch
Ссылка на комментарий

Monnoroch,

  Цитата
Предположим общий включается на первый выброс и после выключается, а частный должен работать всю игру.

Напиши для этого отдельного случая отдельный обработчик. Если так уж до зарезу надо обойти это ограничение, то напиши для функции обёртку с таким же списком аргументов, вызывающую первую функцию. Это будет уже формально другая функция и ты сможет её без проблем подписать.

  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus, кстати об этом, а анонимная функция пойдет для решения проблемы?

навроде:

slt = {fun = function() return f() end}

В смысле так же можно?

 

В общем случае сработает ли такое решение:

function duplicate(f)
  return function(...) return f(...) end
end

ASSERT(f ~= duplicate(f),"?")

Изменено пользователем Monnoroch
Ссылка на комментарий

Monnoroch,

  Цитата
анонимная функция пойдет для решения проблемы?

навроде:

slt = {fun = function() return f() end}

Да, эта анонимная функция будет создаваться всякий раз новая. Подписывай сколько угодно раз.

 

 

  Цитата
В общем случае сработает ли такое решение:

function duplicate(f)
  return function(...) return f(...) end
end

Как-то слишком сложно. Дубликат можно сделать так.

function fun1(a,b,c)
end

function fun1_dublicat(...)
    return fun1(...)
end

  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus, Ну да, зато у меня можно создавать сколько угодно дубликатов :)

 

Добавлено через 29 мин.:

Кто-нибудь может подсказать, можно ли в lua выражение:

if not a then f() end

заменить на

a or f()

И соответственно:

if a then f() end

заменить на

a and f()

 

Чуть более сложнее, может ли там быть statement:

a and c = 1

или

a or return

?

Изменено пользователем Monnoroch
Ссылка на комментарий

Коротко - да.

Результатом такого выражения становится последний компонент, подошедший под условие

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Вот, для любителей выкладываю слот-сигнальную систему v 2.0 собственного приготовления. Она чуть более ООП, чуть менее суровая и чуть более настраиваемая.

http://ifolder.ru/28140737

Ах да, делалась она на основе системы malandrinus, из оригинального кода взято обеспечение корректной работы очередей и каменты, так что не надо удивляться :)

И да, спасибо ему за идею.

 

И таки "a or return" не работает, по крайней мере codepad не понимает, потому там такие штуки везде накомментированы, тоже не надо удивляться...

 

Добавлено через 18 мин.:

  Цитата
Как-то слишком сложно.

Если обобщить твой вариант для произвольной функции получится:

function dublicat(f, ...)
    return f(...)
end

Но это странный вариант. Он не создает новую функцию.

А моя функция принимает функцию и возвращает ее копию. А уже копию я могу приписать к тому же сигналу.

Хотя тут явная проблема в том, что отписать этот слот будет затруднительно - только если закэшировать...

Изменено пользователем Monnoroch
Ссылка на комментарий
  Цитата
И таки "a or return" не работает, по крайней мере codepad не понимает, потому там такие штуки везде накомментированы, тоже не надо удивляться...

return туда нельзя пихать! Он не может участвовать в логических операциях, так как не является вычислимым выражением, является конструкцией языка.

Надо писать

 return a or f()

Вот так - правильно. Вернет либо а, либо результат выполнения функции f в случае, если a равно false или nil

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

xStream, Да, я уже это понял :)

Просто в D есть такая штука, что выражения типа void туда пихать можно, в результате всё expression преобразуется в statement и получаются такие вот красивые ветвления.

Ссылка на комментарий

Вот интересно, почему local sim = alife() и далее по тексту - можно писать, а с vector() такое не прокатывает ?

Универсальное правило есть какое-то ?

 

Ссылка на комментарий

Dennis_Chikin,

  Цитата
Вот интересно, почему local sim = alife() и далее по тексту - можно писать, а с vector() такое не прокатывает ?

Не совсем понятно, что ты имеешь в виду. Что ты хочешь от сохранённого на потом вектора?

Вообще же, когда ты пишешь alife() ты вызываешь функцию получения глобального объекта класса alife_simulation. Этот объект существует постоянно (по крайней мере в пределах одной загруженной игры). Если же пишешь vector(), то это вызов конструктора класса vector с созданием нового экземпляра объекта. Не знаю, отвечает ли это на вопрос...

  Полезный утиль (Показать)
Ссылка на комментарий

xStream, вот вариант (проверенный в игре) для 'skeleton' в формате ACDC и без внешней функции:

  код (Показать)
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Не, каша. Скелет - отдельная неделимая сущность, представляющая собой одно свойство.

ИМХО код гораздо более громоздкий вышел

 

Что касается чанков - это дело барское. Непонятно, как это относится к исходной библиотеке. Это уже доп функционал. Реализуется, кстати, легко с помощью tail_data.

Скелетон я проверила в той версии, что сейчас лежит. Хук для вертолетов тоже приложен. Считаю эту версию пока конечной. За мануал вполне идет описание из шапки.

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Согласен, что код несколько более громоздкий, чем при локальном исполнении, но ... это и именно в формате ACDC и как раз не не делит сущность скелета, а обрабатывается внутри класса(ов) в зависимости от условий.

Твой нынешний вариант тоже гонял в игре, рабочий. Оба варианта идентичны по результату.

Посто данный подход позволяет внутри класса замыкать именно его нюансы и следовать формату ACDC, а не выводить каждый раз во внешнюю примочку. Это вполне может быть актуальным, если далее подстраивать/расширять коды под версии игры (+ЧН, +ЗП) и дополнять недостающие классы.

Собственно дал как информацию, может быть и полезной ... и с целью синхронизации. Отказаться в пользу иного всегда не позно, если на то есть причины. :-)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Тогда уж вноси шейпы и кастомдату в соответствующие пакеты, загромождай код. :-P

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

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Не буду продолжать спор о фломастерах ... ;-), хотя можно указать, что тогда уж и всему подобному не место в классах, т.е. все _read/_write из классов поубирать, оставив на откуп net_base и внешним функциям ... (ниже как раз такой "кандидат" на вынос).

 

По делу: Похоже в "-- item packet hooks" (класс cse_alife_item) есть неточность. По условию 'num_items' == 0 должны отсекаться чтение/запись всех(!) последующих пропертей, а в настоящей реализации отсекаются (в skip_updprops) только последние два, обусловленные своими доп.условиями. Более павильно вроде бы так (для _read):

  код (Показать)
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...