Snusmumriken
Нет, можно функциональщину. quicksort [] = [] quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) where lesser = filter (< p) xs greater = filter (>= p) xs
Tverd
ну это луче
Tverd
хоть и не сильно пока понятно )
Snusmumriken
Для меня, например, сиподобный синтаксис обязателен, потому что фукциональщина - решение долбанутых головоломок и попытки надуть язык так чтоы он этого не заметил, и неожиданно для себя сделал то что нужно.
Snusmumriken
Но я бы не отказался от расширения семантики луа сокращениями типа тех же стрелочных функций, но нативных.
Snusmumriken
Эти две штуки эквивалентны. В смысле, что объявляется переменная 'a' и становится функцией. a = function(foo) return foo * bar end => a = foo => foo * bar
Вот типа этого, что я делал транслятором строки в аналогичную функцию (чуть ниже сообщения - пример использования)
Snusmumriken
Надо ещё аналогичные тернарники намутить, если покатят с локальными переменными.
Ilia
А как же terra lang?
Snusmumriken
Ой, какая смешная штука. Названием напоминает текстовый редактор "edm" - как EDitor for Mortals, который был в противовес редакторам для нечеловеков (типа vi). Только "язык для землян" в противовес "языку для лунатиков"
Anonymous
А в lua есть оператор, который из функции делает таблицу с десятью одинаковыми функциями?
Anonymous
Или со строками то же самое. Играюсь в minetest, а во внутриигровых компьютерах нехороший админ поставил ограничение по количеству выполняемых функций
fgntfg
можно сделать таблицу функций
Anonymous
Это как ?
что-то вроде fun * 3 = fun2() { fun(); fun(); fun(); }
Snusmumriken
По количеству одновременно выполняемых функций? То есть, если функция вызывает другую функцию, так вызывает третью и т.д, то оно блочит? (Блок по стактрейсу), или нельзя много раз вызывать одну и ту же функцию потому что есть блокировка и хук на исполнение?
Anonymous
или 5 * "a" = "aaaaa"
void *
или 5 * "a" = "aaaaa"
можно на строки метатаблицы ставить, емнип или нельзя?
grinchfox
Можно придумать свой стек на корутинах
Snusmumriken
Можно хакнуть этого чувака, поставив хук на хук, обнуляющий его действие.
Anonymous
звучит как хук в боксе %)
Snusmumriken
Ничо, ничо. Хуки - это весело и мило.
Snusmumriken
Но медленно.
fgntfg
А что в конечном итоге хочешь сделать?
Snusmumriken
А еще можно научиться композировать функции в одну.
fgntfg
Нагрифить?
fgntfg
function fn(s, ...) local src = [[ local L1, L2, L3, L4, L5, L6, L7, L8, L9 = ... return function(P1,P2,P3,P4,P5,P6,P7,P8,P9) return ]] .. s .. [[ end ]] return loadstring(src)(...) end
fgntfg
можно попробовать так, но у меня самнения.
Snusmumriken
Хех, кстати забавно. Таким образом можно перегенерировать функцию в те моменты когда она блокируется.
Snusmumriken
Типа обновляем.
grinchfox
Да, храни функции в строках
grinchfox
Кешируй последние n
Anonymous
А что в конечном итоге хочешь сделать?
Есть робот внутри игры. Количество инструкций, которые может выполнить робот, ограничено числом 49. Если он захочет выполнить больше - крашнется. При этом размеры программы не ограничены и всяких if'ов и стейтов можно понаделать сколько захочется. Выполнив свои 48 функций, в следующем тике робот начинает исполнение программы заново. При этом в идеале сохраняются объявленные переменные. По факту же иногда они также очищаются и процесс начинается полностью заново, видимо какой-то баг или еще что. Я хочу сделать так, чтобы можно было написать в империческом последовательном стиле 50 фукций, не заморачиваясь при этом с ограничениями тика. Таким образом, программа должна отследить количество выполняемых операций и при необходимости отложить остаток выполнения на следующий тик. Попробую корутинами действительно
fgntfg
можно table.insert(arr, [вот сюда анонимная функция])
fgntfg
хмм, computer craft для minecraft както по добрее был
grinchfox
Есть робот внутри игры. Количество инструкций, которые может выполнить робот, ограничено числом 49. Если он захочет выполнить больше - крашнется. При этом размеры программы не ограничены и всяких if'ов и стейтов можно понаделать сколько захочется. Выполнив свои 48 функций, в следующем тике робот начинает исполнение программы заново. При этом в идеале сохраняются объявленные переменные. По факту же иногда они также очищаются и процесс начинается полностью заново, видимо какой-то баг или еще что. Я хочу сделать так, чтобы можно было написать в империческом последовательном стиле 50 фукций, не заморачиваясь при этом с ограничениями тика. Таким образом, программа должна отследить количество выполняемых операций и при необходимости отложить остаток выполнения на следующий тик. Попробую корутинами действительно
Корутины ?
Anonymous
Это minetest, тут опенсурс и сервера работающие по 16 часов в сутки
Snusmumriken
Все что угодно можно сделать злым, если поставить хуки :3
fgntfg
Может поднять minetest сервачёк, железо есть и простаивает
Anonymous
подними
void *
поиграл в minetest, он крутой конечн, но имхо чего-то не хватает ему
void *
не в плане контента
grinchfox
Ему нехватает всего
grinchfox
Выживания там нету нормального как в mc
void *
да были вроде моды какие-то
grinchfox
А все что есть очень сырое для игры
fgntfg
Я играл в совершенно бородатые бетки майнкрафт. Только креативный режим, не бесконечная карта, жуткие тормаза явы.
void *
жуткие тормоза и сейчас есть :D
Snusmumriken
Причем виновата не жава
void *
+
fgntfg
Sergey
Если кто есть из Екатеринбурга, завтра будет мой доклад как накодить игру на Corona SDK и Lua. В яндексе.
Tverd
Может и нет никого, но я бы посмотрел
Yogurt
Никто не знает как в MoonSharp автоконвертить вызываемые имена?
Yogurt
Чтобы вместо kingdom:AddBuilding ("field") писать kingdom:add_building ("field")
Anonymous
Думаю, метатаблицы справятся с этим
Yogurt
в смысле?
Yogurt
Просто методов много, хочется в автоматическом режиме
Anonymous
Ну дык. Для kingdom прописывается метатаблица, которая перехватывает __index или что там используется и заменяет все имена вида add_building на AddBuilding, после чего возвращает соответствующую функцию.
Anonymous
Имя функции будет на лету подменяться при каждом вызове. А функцию для конвертации имён можно написать один раз, чтобы она работал для любого имени функции.
void *
можно рефлексией в шарпе ходить по методам и ставить атрибут, емнип
Yogurt
Yogurt
setmetatable(kingdom, { __index = function(table, key) return table[cool_key(key)] end })
Yogurt
Как-то так выходит, да?
Anonymous
Ага
Yogurt
Сяп
Yogurt
http://www.moonsharp.org/proxy.html
Yogurt
DВо
Yogurt
Только со статиками плохо работает
Snusmumriken
Чот такое. Только вместо lower можно ещё и вырезать все не буквенные символы.
Snusmumriken
Тогда можно будет писать kingdom:ADD_BUILDING ("field") и kingdom:adD_____BuiLDinG ("field") Но сами функции должны называться addbuilding. И это чуть медленнее.
Snusmumriken
А, я мутил логгер таким образом, чтобы можно было каждому уровню логирования влепить свой аппендер. Допустим, чтобы на info/warn он писал в файл, а fatal - и в файл и по интернету мне присылал результат лога. Чот такое. Но с обработкой ключа в __index - суть ясна, думаю.
Yogurt
Yogurt
Ну вот я как всегда
Snusmumriken
Карочи, кое-где, пара разделов ПО-проекта использовали слегка разные логгеры: в одном, имена методов (warn/debug/) были с большой буквы, в другом - с маленькой. Когда от одного из логгеров избавились, чтобы обеспечить совместимость обеих частей проекта друг с другом, были сделаны алиасы методов вида debug/Debug, а я решил устранить эту фигню на корню, чтобы было пофигу как вызывать. Если есть куча лигаси-кода, на переделку стандартизацию которого уйдёт фуллтайм пара месяцев - это оправдано.
Snusmumriken
P.S. Кто-то любит капс (в логгере это даже оправдано, что-то типа log:WARN видно гораздо лучше чем log:warn). Кто-то любит кемел-кейс. А кто-то - андерслеши. А кто-то - табы вместо пробелов и наоборот. Ну щито поделать.
Yogurt
У проектов есть стайл гайды
Snusmumriken
Иногда )))))
Yogurt
Если у проекта нет стайлгайда и там больше одного кодера, то это или плохой проект или один из прогер нещадно бьет других пока они не удовлетворят его стайл потребности