vitaly
люблю этот чат
Dmitry
Здравстуйте! Можно ли в lua написать каким-то образом макросоподобную функцию return_if(выражение) и если результат вычисления выражения не null, то происходит возврат из функции. Хочется просто записывать всякие local result = выражение if result ~= null then return result end в одну строку Другими словами: можно ли из функции 1 зафорсить возврат из функции выше по-уровню (функции 2, из которой была вызвана функция 1)?
Saphire
Макросов нет
Saphire
Но есть корутины
Dmitry
а как это изящно можно написать с помощью корутин?
Snusmumriken
Лол, только что писал UPD: Хорошо что запостил, заметил ошибку.
Snusmumriken
а как это изящно можно написать с помощью корутин?
А ещё это можно "изящно написать" через pcall, просто пишем код как будто всё хорошо, но с ассертами. local res, err = func(blah) if not res then return nil, err end => local succ, err = xpcall(function() local res = assert( func(blah) ) res.blah = res.foo:format('bla-blah') end, debug.traceback)
Dmitry
pcall + assert интересно...
Snusmumriken
В целом, функции которые не рейзят ошибки должны возвращать ошибку вторым аргументом, так что ассёрты обычно пашут. Но это всё равно не путь самурая, настоящий китаец будет фигачить if not res then return nil, err end. Потому что (x)pcall медленный. Да и сам процесс перестаёт быть таким очевидным. Зато можно в любой момент рейзнуть ошибку.
Dmitry
спасибо!
Dmitry
lua с макросами всё-таки интересное направление, как-нибудь озадачусь пусть висит процесс в фоне, отслеживает изменения файлов и генерирует по коду проекта .macrolua -> .lua, почему нет.. sass|less -> css же есть, почему бы и к lua макросы не прикрутить..
Snusmumriken
Ну есть metalua, правда, это типа таки отдельный интерпретатор. А ещё, ну ты знаешь, хотелось бы автоматического преобразования metalua -> lua на лету. Это даже не очень сложно устроить.
Snusmumriken
Просто переопределить require. Берёшь такой и переопределяешь. Проверяешь файлы по package.path, смотришь не лежат ли рядом такие же, но в формате metalua. Найдено? Читаешь, преобразуешь, loadstring'аешь. Не найдено? Отправляешь в обычный require.
Snusmumriken
Ну и типа такой: require'meta' -- переопределяет require в meta-сторону local mod = require'meta_module' Так можно хоть moon-скрипты грузить на лету, хоть что. Единственная неприятность — изменение логики стандартной штуки.
Anonymous
hi
Anonymous
thank you four add me
Anonymous
hi
Kirill
Kirill
Hello there
Anonymous
pless how to create oop in lua
Anonymous
😔😔😔😔😔
Kirill
Anonymous
what????
Anonymous
why bro
Kirill
so hard
Kirill
Lmao
Anonymous
I did not understand ... but I want to create an object how can it be
Din 🐍
Лол, только что писал UPD: Хорошо что запостил, заметил ошибку.
Аа, меня триггерит такое форматирование кода Хотя я знаю, что оно не является неверным
Snusmumriken
I did not understand ... but I want to create an object how can it be
Section 3.2 http://tylerneylon.com/a/learn-lua/
Anonymous
thank you bro
Din 🐍
Имхо ухудшает читаемость
Din 🐍
Я читаю код по горизонтали, но никак не иначе
Snusmumriken
Я читаю код по горизонтали, но никак не иначе
Очень много проверок. Если не запихнуть в одну строчку — будет довольно монструозно и затянуто, чудовищная вертикальная избыточность. А ещё уже привык блочно форматировать, просто представь что это табличка в экселе. Можно, правда, ещё ассёртами разбрасываться, но нежелательно.
fgntfg
Можно написать таблицу и функцию, которая будет её обрабатывать
behran
Кто-нибудь настраивал Lua+odbc?
Elias
Лол, только что писал UPD: Хорошо что запостил, заметил ошибку.
Я бы сделал табличку, где ключу соответствует тип, и потом бежал бы по ней в функции и чекал данные
Elias
Точнее: Название поля -> { тип/проверка на корректность (функция), сообщение об ошибке }
Snusmumriken
Ещё больше мороки : )
Yuriy
Ещё больше мороки : )
Так наоборот проще. Положил в таблицу. Каждое поле имеет тип и параметр ответа при неверно типе
Anonymous
local vip={} --oop... vip.Hi=function() print("?????") end local ch=vip:new() ch.Hi() .....
Anonymous
this is oop in lua
Snusmumriken
local vip={} --oop... vip.Hi=function() print("?????") end local ch=vip:new() ch.Hi() .....
1. Feel the difference between foo.bar() and foo:bar(). 2. You are wrong and you know it, too small amount of info : )
Anonymous
Where is the mistake ... is Hua at the point (.) Or at (:)
Snusmumriken
Ну а так - local Class = {} Class.__index = Class function Class:new(x, y) self = setmetatable({}, self) self.x, self.y = x, y return self end local SubClass = setmetatable({}, {__index = Class}) SubClass.__index = SubClass function SubClass:new(x, y, w, h) self = Class.new(self, x, y) self.w, self.h = w, h return self end
Snusmumriken
This is the simplest implementation of OOP in Lua.
Anonymous
But what is the work (__index)
fgntfg
Ещё больше мороки : )
Зависит от числа исключений.
Snusmumriken
But what is the work (__index)
Keys that are not found in the main "object" table will be searched in the __index "class" table. Class contains methods and shared (generic) keys.
Snusmumriken
But what is the work (__index)
Why do you need OOP? Learn first without it.
Anonymous
Well ... Another question ... Simple game design ... -1- Any program I use .... and a simple game how much time can I design
Anonymous
Because I really like object programming I see it as fun
Snusmumriken
Ok, then learn metatables : )
Anonymous
Ok, then learn metatables : )
Thanks ... but metatable its merge or compilation
Snusmumriken
There very simple concept, just play with it.
Elias
I'd suggest to just use this lib and be happy: https://github.com/kikito/middleclass
Elias
Used it for three years and I'm totally happy with it
Anonymous
Well I will see ... Thank you for cooperation ... I am from Algeria and I am pleased with you
Alexey
Few days ago there was ann about new oop lib https://github.com/kurapica/PLoop
Andrey
как принтом вывести название текущего модуля ? ну например я через require вызываю модуль foo там есть функция bar и функция bar при вызове должна сказать что она находится в модуле foo ?
Andrey
и второй вопрос - как модулем определить какой другой модуль его инициализировал через require
Snusmumriken
как принтом вывести название текущего модуля ? ну например я через require вызываю модуль foo там есть функция bar и функция bar при вызове должна сказать что она находится в модуле foo ?
print(...) Можно в начале модуля написать local modulename = ... Если это не модуль (стартует в интерпретаторе или dofile'ом), тут будет nil.
Andrey
ага, спасибо!
akamit
привет. подскажите пожалуйста, не получаетс разобраться как пользоваьтся json.util.null?
akamit
проблема в том, что lua интерпретирует json {"key": null} - null как функцию
akamit
вроде так помогло: local r = json.decode(b, json.decode.simple)
Snusmumriken
Что за библиотека? У cjson есть cjson.null, который используется для, собственно, сравнения на null. Дело в том, что у javascript'а есть два обозначения для "пустых" значений: undefined, и null. В луях, вместо этого один только nil. Чтобы луа получила возможность, как и жаваскрипт, различать где null а где undefined — некоторые библиотеки вводят свой тип для null, а доступ к нему — через libname.null или как у тебя json.util.null или ещё как-то. Из-за этого у луёв появляются некоторые проблемы, например, этот json.null может интерпретироваться как логическая истина, соответственно, какая-нибудь проверка типа local value = jsdata.key or '' может не сработать, потому что jsdata.key может быть этим самым null, и при попытке его вывести/сконкатенировать может получиться что-то неприятное. Поэтому такие проверки приходится расширять примерно так: local value = jsdata.key ~= json.null and jsdata.key or ''
Snusmumriken
Ну и смотри документацию к библиотеке.
mva
чят, а ты не в курсе, существуют ли pure-lua либы для работы с yaml, как с таблицами (а-ля cjson)?
mva
// ну ООООЧЕНЬ не хочется юзать lyaml
Anonymous
https://gist.github.com/obikag/7590516 Подскажите пожалуйста как заставить работать этот код на lua 5.3 Ошибка в рантайме "нельзя преобразовать b.."
Asiman
/loss@FailsBot
Elias
Буду за него: ⠀⠀⠀⣴⣴⡤ ⠀⣠⠀⢿⠇⡇⠀⠀⠀⠀⠀⠀⠀⢰⢷⡗ ⠀⢶⢽⠿⣗⠀⠀⠀⠀⠀⠀⠀⠀⣼⡧⠂⠀⠀⣼⣷⡆ ⠀⠀⣾⢶⠐⣱⠀⠀⠀⠀⠀⣤⣜⣻⣧⣲⣦⠤⣧⣿⠶ ⠀⢀⣿⣿⣇⠀⠀⠀⠀⠀⠀⠛⠿⣿⣿⣷⣤⣄⡹⣿⣷ ⠀⢸⣿⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣿⣿⣿⣿⣿ ⠀⠿⠃⠈⠿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⠿⠿⠿ ⠀⢀⢀⡀⠀⢀⣤⠀⠀⠀⠀⠀⠀⠀⡀⡀ ⠀⣿⡟⡇⠀⠭⡋⠅⠀⠀⠀⠀⠀⢰⣟⢿ ⠀⣹⡌⠀⠀⣨⣾⣷⣄⠀⠀⠀⠀⢈⠔⠌ ⠰⣷⣿⡀⢐⢿⣿⣿⢻⠀⠀⠀⢠⣿⡿⡤⣴⠄⢀⣀⡀ ⠘⣿⣿⠂⠈⢸⣿⣿⣸⠀⠀⠀⢘⣿⣿⣀⡠⣠⣺⣿⣷ ⠀⣿⣿⡆⠀⢸⣿⣿⣾⡇⠀⣿⣿⣿⣿⣿⣗⣻⡻⠿⠁ ⠀⣿⣿⡇⠀⢸⣿⣿⡇⠀⠀⠉⠉⠉⠉⠉⠉⠁
Asiman
не пойму что тут нарисовано
Саша
ис зис лос?
Asiman
поел, пасиб
Anonymous
hi goodmorning all
Anonymous
how are you all
Andrey
Подскажите пожалуйста - require('modname') - возвращает true если нашла модуль или false если не нашла. А как понять по ее вызову - инициализировала ли она модуль или проигнорировала т.е. он ранее был загружен? Я так понимаю только через предварительную проверку package.loaded ? Или саму require можно вызвать с какими то параметрами ?
Anonymous
How to store a large number of data without mentioning any of them ... Like Python we use (args, ** kwargv)