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
Snusmumriken
Anonymous
thank you bro
Din 🐍
Имхо ухудшает читаемость
Din 🐍
Я читаю код по горизонтали, но никак не иначе
Snusmumriken
Я читаю код по горизонтали, но никак не иначе
Очень много проверок. Если не запихнуть в одну строчку — будет довольно монструозно и затянуто, чудовищная вертикальная избыточность. А ещё уже привык блочно форматировать, просто представь что это табличка в экселе.
Можно, правда, ещё ассёртами разбрасываться, но нежелательно.
fgntfg
Можно написать таблицу и функцию, которая будет её обрабатывать
behran
Кто-нибудь настраивал Lua+odbc?
Elias
Точнее:
Название поля -> { тип/проверка на корректность (функция), сообщение об ошибке }
Snusmumriken
Ещё больше мороки : )
Yuriy
Ещё больше мороки : )
Так наоборот проще. Положил в таблицу.
Каждое поле имеет тип и параметр ответа при неверно типе
Din 🐍
Anonymous
local vip={}
--oop...
vip.Hi=function()
print("?????")
end
local ch=vip:new()
ch.Hi()
.....
Anonymous
this is oop in lua
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)
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.
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 : )
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
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)