MrSmith
Казалось бы да, но вот к примеру хочется еще что бы можно было ман динамически писать и т.д.
MrSmith
я про help и man
MrSmith
Тоесть ну ты понял
Snusmumriken
Нет, объясняй по-человечески, желательно полностью.
Я дурачок в данном плане. Модуль мана в петоне - это автодок.
MrSmith
Нет, объясняй по-человечески, желательно полностью.
Я дурачок в данном плане. Модуль мана в петоне - это автодок.
Смотри вот пишешь ты программу, хочешь иметь к примеру расширямый код, где дополняя в одном месте ты бы получал новый функционал, а не жестко сцпленный код, казалось бы в чем проблема, юзай делегаты и жизнь счастье, но вот тут встает проблема, тебе нужна таблица подобие класса, которая бы предаставляла data, чекала ее после принятия и т.д. Но при этом ты бы хотел, что бы внешне она выглядела как переменная строки, понял?
Snusmumriken
Смотри вот пишешь ты программу, хочешь иметь к примеру расширямый код, где дополняя в одном месте ты бы получал новый функционал, а не жестко сцпленный код, казалось бы в чем проблема, юзай делегаты и жизнь счастье, но вот тут встает проблема, тебе нужна таблица подобие класса, которая бы предаставляла data, чекала ее после принятия и т.д. Но при этом ты бы хотел, что бы внешне она выглядела как переменная строки, понял?
Твой текст сейчас выглядит как что-то несвязное.
Что я понял:
1. Проверка переменной на рендж (!), которое требует
2. help/man, (автодоки?), которые как-то связаны с
3. Вопросом по метатаблицам
MrSmith
MrSmith
https://ru.wikipedia.org/wiki/Man
MrSmith
Я про это
MrSmith
Вот как бы сделать такое в луа.
MrSmith
И чтоб грамотно, расширяемо и тд
Snusmumriken
Аналог argc/argv, аргументы консоли:
a = arg[1]
b = arg[2]
Вот, мы получили аргументы с которыми вызывался скрипт в оболочке.
Когда ты запускаешь скрипт - функция "main" начинается с первой же строчки кода.
Snusmumriken
Snusmumriken
Это оно?
Alexey
Там все параметры командной строки идущие до скрипта идут в отрицательную сторону
Alexey
Поэтому интерпретатор имеет индекс минимальный
Alexey
Сам скрипт всегда 0
Snusmumriken
Сам скрипт всегда 0
Поэтому можно легко прописать пути до директории со скриптом/модулем. Не думаю что наспамлю если запостю, благо можно будет ссылаться.
local path = (arg[0]:match'(.*)[\\/]'):gsub('\\', '/')
local mpath = arg[1] and (arg[1]:match'(.*)[\\/]'):gsub('\\', '/')
local lpath = {
path..'/?.lua',
path..'/?/init.lua',
}
local cpath = {
path..'/?.dll',
path..'/?/?.dll',
path..'/?/core.dll'
path..'/?.so',
path..'/?/?.so',
path..'/?/core.so'
}
if mpath then
lpath[#lpath + 1] = mpath..'/?.lua'
lpath[#lpath + 1] = mpath..'/?/init.lua'
cpath[#cpath + 1] = mpath..'/?.dll'
cpath[#cpath + 1] = mpath..'/?/?.dll'
cpath[#cpath + 1] = mpath..'/?/core.dll'
cpath[#cpath + 1] = mpath..'/?.so'
cpath[#cpath + 1] = mpath..'/?/?.so'
cpath[#cpath + 1] = mpath..'/?/core.so'
end
package.path = table.concat(lpath, ';')..';'..package.path
package.cpath = table.concat(cpath, ';')..';'..package.cpath
MrSmith
Падажи, а где eval?
MrSmith
А я понял, его нет
MrSmith
Щас напишем
Alexey
Поэтому можно легко прописать пути до директории со скриптом/модулем. Не думаю что наспамлю если запостю, благо можно будет ссылаться.
local path = (arg[0]:match'(.*)[\\/]'):gsub('\\', '/')
local mpath = arg[1] and (arg[1]:match'(.*)[\\/]'):gsub('\\', '/')
local lpath = {
path..'/?.lua',
path..'/?/init.lua',
}
local cpath = {
path..'/?.dll',
path..'/?/?.dll',
path..'/?/core.dll'
path..'/?.so',
path..'/?/?.so',
path..'/?/core.so'
}
if mpath then
lpath[#lpath + 1] = mpath..'/?.lua'
lpath[#lpath + 1] = mpath..'/?/init.lua'
cpath[#cpath + 1] = mpath..'/?.dll'
cpath[#cpath + 1] = mpath..'/?/?.dll'
cpath[#cpath + 1] = mpath..'/?/core.dll'
cpath[#cpath + 1] = mpath..'/?.so'
cpath[#cpath + 1] = mpath..'/?/?.so'
cpath[#cpath + 1] = mpath..'/?/core.so'
end
package.path = table.concat(lpath, ';')..';'..package.path
package.cpath = table.concat(cpath, ';')..';'..package.cpath
Скрипт может иметь относительный путь
Поэтому этот вариант иногда будет работать
MrSmith
load случаем не делает то что я хочу?
Tverd
loadfile и loadstring еще есть
Tverd
http://www.lua.ru/doc/5.1.html
MrSmith
Я просто сигнатуру не понял
MrSmith
loadfile ([filename [, mode [, env]]])
MrSmith
И с примерами тоже нема
MrSmith
_VERSION=0
print(_VERSION)
MrSmith
Внезапно
MrSmith
Это однозначно бажина
MrSmith
Но в силу динамической типизации лечимая только со стороны интерпритатора
MrSmith
Кстати, такой вопрос как я могу сделать колбэк
Mons
а в чём проблема?
Mons
local function test(cb)
print("calling callback")
cb()
end
test(function() print("I am callback") end)
fgntfg
хорошо бы проверить что кобек функция, но это так, для галочки
Alexey
Callback может быть не функцией
Snusmumriken
Callback может быть не функцией
Спасибо метатаблице!
Поэтому, там проверка типа:
if type(cb) == 'function' or type(cb) == 'table' and type(getmetatable(cb).__call) == 'function' then cb() end
Alexey
Это может быть userdata
A при наличии фантазии у разработчика любой другой тип :)
Alexey
И метатаблица может быть скрыта
Snusmumriken
Ох уж эта динамическая типизация.
Хотя я был бы рад, если бы можно было бы выводить типы на манер "isCallable(something)".
Alexey
Я видел проверку на возможность вызова.
Идея была установить хук на вызов функции в котором прерывать этот вызов и попытатся вызвать объект
Art
#book #lua Спасибо - хорошее качество
Alexey
Я ипользую много каллбаков. Я решил использовать только финкции.
Например имеем функцию fn(opt, cb) где оба параметра не обязательные.
Тогда при вызове fn(setmetatable({a=1},{__call=function()end})) очень сложно
реализовать предсказуемую семантику если разрешить callback быть не функцией
Tverd
Можно использовать вместо колбэков - события... тогда входной параметр либо функция, либо таблица с функцией по имени события... ну или на худой конец промисы использовать
Snusmumriken
Эвентлупы ещё : )
Tverd
Насчет колбэк не функция - на мой взгляд излишне... Ну кроме таблицы...
Alexey
EventEmitter
Tverd
Именно
Alexey
Я его тоже использую.
Tverd
Безумно полезная вещь, сделал mixin с эвентом - все стало намного интереснее )
Tverd
кстати, тут NodeMCU никто не увлекается?
Alexey
FreeSWITCH использует просто строки для callback.
Нужно передать имя глобальной функции.
И ни кто не жалуется :)
Tverd
ну и нормально, чего огород городить ))))
Alexey
Я отлаживал код где в 2 разных местах использовалось одно и тоже имя :)
fgntfg
#DEFINE TRUE FALSE
Tverd
Думаю что это было сделано, что бы не попасть в состояние, когда мы что-то удалили, а сборщик мусора не убрал... а через _G проверили и если есть - запустили
vvzvlad
//удачной отладки, суки
Alexey
Tverd
интересно... тогда из С дергать функцию по ее имени ) Не заморачиваясь
Snusmumriken
Кстати, я внезапно понимаю, откуда это "удачной отладки".
Наблюдал вариант, когда модуль реквайрит пару модулей, которые дефайнят глобальные функции с одним и тем же именем, а потом сам её передефайнит, но использует несколько раз: до передефайна и после. Это было весело (нет).
Tverd
вот для этого в мунскрипте по умолчанию все переменные локальные )))
Alexey
Ну ты запустил скрипт.
Он работает и управляет сессией например.
Проигрывает музыку, собирает нажатые клавиши итд
fgntfg
складывать функции в стек, и вызвывать их по имени стека, удаляя из стека после вызова
Snusmumriken
Сам с глобальным стараюсь не работать.
Если модулю нужен метод из другого модуля - пущай другой модуль возвращает табличку со своими фичами и не отсвечивает НИЧЕМ глобальным.
Структура проекта должна быть видна из любой его части.
Иначе получается односвязный список, где мы видим только "следующее", но не можем обратиться к "предыдущему".
Tverd
А есть прикол, еще Роберто писал - при загрузке модуля запрещаешь организовывать глобальные переменные... ) Вот тогда вообще отлично
Snusmumriken
Ну, там можно через setfenv.
Или, кстати, есть весёлый вариант: переопределяем require на загрузку модуля, и проверку, не появилось ли в _G что-то новое )))
Если появилось - бить тапками писателя модуля.
Tverd
да, через require
Yuriy
Всем доброго дня.
может кто подсказать годную библиотеку котороая проверяет файл на соответсвие его расширению?
Snusmumriken
vvzvlad
Я могу как-нибудь сказать, что мне надо захватить 78 символов, кроме как написать кучу точек?
_, _, packet = string.find(buffer_state, "(DAGROOTRAW1..............................................................................RAWEND)")
Alexey
stiring.sub?
Alexey
('.'):rep(78)
Alexey
ну а так string.find начало и далее string.sub
vvzvlad
в смысле? ничего не понял про string.sub
vvzvlad
у меня там fifo-буфер, с одной стороны в него заталкиваются приходящие символы. после каждого раза запускается find и ловит характерную посылку, если она полная. меня бесит то, что в середине захвата для find хз сколько непонятных точечек
Alexey
`
pos = string.find(buffer, 'DAGROOTRAW1')
str = string.sub(buffer, pos, pos + 78)