MrSmith
Казалось бы да, но вот к примеру хочется еще что бы можно было ман динамически писать и т.д.
Snusmumriken
Казалось бы да, но вот к примеру хочется еще что бы можно было ман динамически писать и т.д.
Я пишу маны ручками. Ничего не понимаю. Автодок - это типа "спецкомментарии" к функциям, которые парсятся мануалогенератором и вытряхиваются в файлик рядышком. При чём тут проверка переменной на ренж?
MrSmith
я про help и man
MrSmith
Тоесть ну ты понял
Snusmumriken
Нет, объясняй по-человечески, желательно полностью. Я дурачок в данном плане. Модуль мана в петоне - это автодок.
MrSmith
Нет, объясняй по-человечески, желательно полностью. Я дурачок в данном плане. Модуль мана в петоне - это автодок.
Смотри вот пишешь ты программу, хочешь иметь к примеру расширямый код, где дополняя в одном месте ты бы получал новый функционал, а не жестко сцпленный код, казалось бы в чем проблема, юзай делегаты и жизнь счастье, но вот тут встает проблема, тебе нужна таблица подобие класса, которая бы предаставляла data, чекала ее после принятия и т.д. Но при этом ты бы хотел, что бы внешне она выглядела как переменная строки, понял?
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
Щас напишем
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
Это может быть userdata A при наличии фантазии у разработчика любой другой тип :)
Кстати да. Но типа если пихаешь всякую пакость в колбек - подразумевается что его попытаются вызвать, и если там что-то не то - то дропнет, так что в любом случае всё в порядке.
Snusmumriken
Ох уж эта динамическая типизация. Хотя я был бы рад, если бы можно было бы выводить типы на манер "isCallable(something)".
Alexey
Я видел проверку на возможность вызова. Идея была установить хук на вызов функции в котором прерывать этот вызов и попытатся вызвать объект
Snusmumriken
Я видел проверку на возможность вызова. Идея была установить хук на вызов функции в котором прерывать этот вызов и попытатся вызвать объект
Слишком сложно, и колбеки становятся жутко медленными ((( В luajit подобным образом проверяются колбеки на cdata. Это ужасно. Но там приходится так делать, ибо иначе прога просто аварийно завершится без каких либо уточнений, что не даст возможность нормально исправить ошибку без логирования/скакания по строкам.
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
//удачной отладки, суки
Tverd
интересно... тогда из С дергать функцию по ее имени ) Не заморачиваясь
Snusmumriken
Кстати, я внезапно понимаю, откуда это "удачной отладки". Наблюдал вариант, когда модуль реквайрит пару модулей, которые дефайнят глобальные функции с одним и тем же именем, а потом сам её передефайнит, но использует несколько раз: до передефайна и после. Это было весело (нет).
Tverd
вот для этого в мунскрипте по умолчанию все переменные локальные )))
Alexey
Ну ты запустил скрипт. Он работает и управляет сессией например. Проигрывает музыку, собирает нажатые клавиши итд
fgntfg
складывать функции в стек, и вызвывать их по имени стека, удаляя из стека после вызова
Snusmumriken
Сам с глобальным стараюсь не работать. Если модулю нужен метод из другого модуля - пущай другой модуль возвращает табличку со своими фичами и не отсвечивает НИЧЕМ глобальным. Структура проекта должна быть видна из любой его части. Иначе получается односвязный список, где мы видим только "следующее", но не можем обратиться к "предыдущему".
Tverd
А есть прикол, еще Роберто писал - при загрузке модуля запрещаешь организовывать глобальные переменные... ) Вот тогда вообще отлично
Snusmumriken
Ну, там можно через setfenv. Или, кстати, есть весёлый вариант: переопределяем require на загрузку модуля, и проверку, не появилось ли в _G что-то новое ))) Если появилось - бить тапками писателя модуля.
Tverd
да, через require
Yuriy
Всем доброго дня. может кто подсказать годную библиотеку котороая проверяет файл на соответсвие его расширению?
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)