Archie_ (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Удаления всех комментариев из скрипта.lua
 
Цитата
nikolz написал:
если что-то не учитывает то напишите
это тест:
Все также не справился с этим же многострочным комментарием.
Было:
Код
local bla = 10; 
if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; -- значение активно
--[==[  чтобы использовать многострочный  коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный  коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент   --[=[  вложенный коммент --]=] ]]
--]==]

local bla = 15
Получили: (коммент не удалил и часть кода удалил)
Код
local bla = 10 
if bla == 10 then bla = '--' end 
if bla == '--' then val = true end 
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
Ожидалось:
Код
local bla = 10; 
if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; -- значение активно


local bla = 15

Второй пример
Было:
Код
--[[ parse me ]]--
function test()
   print("\"--[[")
   print("\"]]--")
end

test()

local bla = 10; 

if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; -- значение активно


--[==[  чтобы использовать многострочный  коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный  коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент   --[=[  вложенный коммент --]=] ]]
--]==]

local bla = 15
Получили: (Вообще весь код уничтожен)
Код
ПУСТО!!!!!!!!
Ожидалось:
Код
function test()
   print("\"--[[")
   print("\"]]--")
end

test()

local bla = 10; 

if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end;



local bla = 15
.
Удаления всех комментариев из скрипта.lua
 
Цитата
nikolz написал:
Зачем так агрессивно вести беседу?Я Вам ничего не должен.
Я агресивно не вел беседу, и не говорил что вы мне что то должны. Просто указал на ошибки.
Цитата
nikolz написал:
Выше я привел как я ставлю многострочный
Ставить закрытие в конце строки как у Вас  по-моему мнению это не красиво и не наглядно. поэтому у меня даже мысли не возникало так  ставить
Дело не в том, что закрытие в конце строки, я же вам потом пример показал, где коммент закрывается в начале строки, а дело в том, что если в многострочном комменте встретятся знаки из вложенного многострочного коммента, то все сломается. Или где то в коде если встретится строка с двумя тире, то тоже все посыпется.
Цитата
nikolz написал:
Но если такие чудики есть, то это легко исправить
Вариант с тестом, содержащим символы выделения, тоже решается просто,
Может быть для вас и просто решается, но я этого не увидел.
Для меня это точно не просто.
-------------------------------------------

В любом случае очень большое спасибо!
Ведь только от вас я увидел здесь реальную помощь (пусть этот код не идеален, но как смогли, так и написали), в отличии от остальных ""помощников"", которые фразу 'иди читай мануал' считают за помощь.
Удаления всех комментариев из скрипта.lua
 
Исправил кое какие ошибки
Код
    --===========================================================
    local function DeleteAllCommentsLuaFile(text);
        ----
        local t,t2,t3,one,two,cmt,x,Rem = {},{},{},0,0,0,1,nil;
        local boxOpens,boxClose,RemStr,xt = 0,0,nil,nil;
        local SingleLine,boxActiv,Inside = nil,nil,0;
        local LineCom,LineComM,LineComRemove = 0,nil,nil;
        ----
        for val in (text..'\n'):gmatch(".-\n")do;
            t3[#t3+1]=val:gsub('\n$',(' '):rep(2)..'\n');
        end;
        text = table.concat(t3);
        ----
        for val in text:gmatch(".") do;
            t[#t+1] = val;
        end;
        ----
        for i = 1,#t do;
            --------------------
            if Rem then;
                local Cls = RemStr:match('.',x);
                if Cls == t[i] and x == #RemStr then RemStr = nil Rem = nil Cls=nil end;
                if Cls == t[i] then x = x + 1 end;
                if Cls ~= t[i] then x = 1 end;
                t[i] = "";
            end;
            --------------------
            if LineComRemove then;
                if t[i] ~= '\n' then;
                    t[i] = "";
                else;
                    LineComRemove = nil;
                end;
            end;
            --------------------
            if LineCom == 1 and t[i] ~= "-" then LineCom = 0 end;
            if one==0 and two==0 and not boxActiv and not Rem and not LineComRemove then;
                if LineCom >= 3 then;--4 simb>=
                    if t[i] == "[" or t[i] == "=" and LineComM == 1 then;
                        if t[i] == "[" then;
                            LineCom = 0;
                            LineComM = nil;
                        end;
                    else;
                        t[i-0],t[i-1],t[i-2],t[i-3] = '','','','';
                        LineComRemove = true;
                        LineCom,LineComM = 0,nil;
                        boxOpens,boxClose,SingleLine,cmt,t2 = 0,0,nil,0,{};
                    end;
                end;
                if LineCom == 2 then;
                    LineCom = LineCom+1;
                    if t[i] == "[" then LineComM = 1 end;
                end;
                if t[i] == "-" and LineCom < 2 and not LineComRemove then;
                    LineCom = LineCom+1;
                end;
            end; 
            if not LineComRemove then;
                --------------------------------------------------
                if(t[i]=="'"or t[i]=='"')and Inside>0 and(Inside%2)==1 then xt=t[i]t[i]=''end;
                if(t[i]~="'"or t[i]~='"')and t[i]~='\\'and Inside>0 then Inside = 0 end;
                if(one >= 1 or two >= 1) and t[i]=='\\' then Inside = Inside+1 end;
                ---
                if t[i] == "'" and two == 0 and not boxActiv then;
                    if one > 0 then one = 0 else one = 1 end;
                end;
                ---
                if t[i] == '"' and one == 0 and not boxActiv then;
                    if two > 0 then two = 0 else two = 1 end;
                end;
                ---
                if t[i] ~= '['then boxOpens = 0 end;
                if t[i] ~= ']'then boxClose = 0 end;
                if t[i] ~= "-" then cmt = 0 end;
                ---
                if t[i] == '[' and one == 0 and two == 0 and not boxActiv and #t2 < 2 then;
                    boxOpens = boxOpens+1;
                    if boxOpens >= 2 then;
                        boxOpens = 0;
                        boxActiv = true;
                    end;
                end;
                --- 
                if t[i] == ']' and one == 0 and two == 0 and boxActiv then;
                    boxClose = boxClose+1;
                    if boxClose >= 2 then;
                         boxClose = 0;
                         boxActiv = nil;
                    end;
                end;
                ---
                if SingleLine then t2[1],t2[2] = '-','-'end;
                
                if one == 0 and two == 0 and not boxActiv and t[i] == '-' then;
                   cmt = cmt + 1;
                   if cmt >= 2 then; SingleLine = true; cmt=0 end;
                end;
                ---
                if SingleLine and #t2>=2 then;
                    if (t[i] == '[' or t[i] == '=') and #t2 >= 3 then;
                        t2[#t2+1] = t[i];
                    elseif t[i] ~= '[' and t[i] ~= '=' and #t2 >= 3 then;
                       t2 = {};
                       SingleLine = nil;
                    end;
                    ---
                    if t[i] == '[' and #t2==2 then;
                        t2[3] = t[i];
                    elseif #t2 == 2 and t[i] ~= '[' then;
                        t2 = {};
                        SingleLine = nil;
                    end;
                    ---
                    if #t2 > 3 and t[i] == '[' then;
                        Rem = true;
                        for ii = 1,#t2 do;
                            t[i-(ii-1)] = '';
                        end;
                        RemStr = table.concat(t2):gsub('%s',''):gsub('%-',''):gsub('%[',']');
                        t2 = {};
                        SingleLine = nil;
                        if not RemStr or RemStr=='' then Rem = nil end;
                    end;
                end;
            -------
            end;--LineComRemove
            if xt then t[i]=xt xt=nil end;
        end;--End for #t
        text = table.concat(t);
        ----
        t3 = {};
        for val in text:gmatch(".-\n")do;
            t3[#t3+1]=val:gsub('%s%s\n$','\n');
        end;
        ----
        return table.concat(t3);
    end;
    --===================================
    
    --filename = [[C:\\...]]
     
    local file = io.open(filename..'.lua','r');
    if not file then return end;
    local text = file:read('a');
    file:close();
    -----
    text = DeleteAll_Comments(text);
    -----
    file = io.open(filename..'_.lua','w');
    file:write(text)
    file:close();
    --===================================
Удаления всех комментариев из скрипта.lua
 
Цитата
Anton написал:
Оптимистичный вы человек.
А что, проверить расширения у файла, это действительно условие в одну строчку кода.
И даже если не делать всяких этих проверок, и зная что эта функция для очистки комментариев файла.lua и пихать в неё файл с++, как вы написали выше, и при уничтожении этого с++, я считаю, что это не в коем случае не ошибка функции, а тупость человека.

Цитата
Anton написал:
Уверен, что есть особенности еще, которые ни вы, ни я не знаем. Речь об этом, а не о конкретном косячке. Впрочем, уже писал, если все устраивает и вы не систему ПРО делаете, то и ладно и хорошо.
Я и не отрицаю что где то могут быть косячки (хотя на ошибки вы мне так и не указали). Повторюсь, что я не программист и я не в состоянии пропарсить весь lua т.к. моих знаний не достаточно в этой области, а функцию охота максимально безошибочную, поэтому я и обратился за помощью на форум(ы), но на всех форумах либо не было ответа, либо предлагались варианты по типу функции nikolz, которые ломались на элементарных вещах. Не дождавшись помощи, я начал пытаться написать ее сам, но опять же вместо помощи(хотя бы в указании ошибок, а не написании кода) я услышал только критику в стили, что за ересь ты делаешь, у тебя вообще все неправильно, читай то, да то. Я даже если это все прочитаю, то я все равно идеально не напишу, повторюсь - потому что я не программист. И если вы хотели/хотите показать какой вы умный в этой области, то взяли бы и помогли физически, а не умничали! А умничать извините, я тоже умею. Могу начитаться в любой области и умничать сидеть, только толку от этого не будет не какого. Ум свой нужно показывать практический, а не технический!!! От вашего технического ума толку не какого нет(в любой области)!
----------
Посидите на Англоязычных форумах, вы там никогда такой ереси не услышите, типа " Иди читай мануал " или что то в этом духе (ну может быть в редких случаях, и то это скорое всего будет Русский человек), там либо помогут (не обязательно физически, а также в прочтении чего нибудь и в этом случае обязательно предоставят ссылочки на не заумные статьи, что бы человек понял о чем речь), либо пройдут мимо, а на Русско Язычных форумах это сплошь - да рядом. Я не знаю, но это Русский народ свою тупость так показывает что ли, или что, я не понимаю.
---------
А форум для того и существует, что бы обмениваться и делится информацией, просить помощи и помогать друг другу, а не умничать!!!!!!! А если охота поумничать , то это нужно не на форум, а на лавочку к подъезду (Но Русский наш народ по ходу перепутал эти места).
---------
Прошу прощения, если чем то задел, Обидеть не в коем случае не хотел.
Удаления всех комментариев из скрипта.lua
 
Цитата
Anton написал:
Обратите внимание, у вас в коде нет вообще пути  "я не буду это парсить". Сунем на вход c++ и скрипт бодренько поудаляет из него все, что ему показалось луа-стайл комментарием.
Про путь это уже обертка и к функции пока не имеет никакого отношения! Про защиту от "не .lua" файла я еще не заморачивался и эта защита пишется в пару строк и за пару минут !
В коде и io.open пока за пределами функции, что бы не мешалась мне и что бы вам при тесте не прописывать их, в конечном варианте io.open будет внутри функции.
Суть функции пока состоит в том, чтобы удалить комментарии максимально безболезненно в любой ситуации в lua файле, а не в каком то с++, про защиту - это позже. А как теперь - поломаете ?
Удаления всех комментариев из скрипта.lua
 
Я о такой манипуляции
Код
"bla\"bla"
даже и не знал, поэтому и не учел ))
Спасибо за подсказку, еще один баг устранили))  
Удаления всех комментариев из скрипта.lua
 
Ошибочка вышла в предыдущем сообщении))
Код
    local function DeleteAll_Comments(text);
      ----
      local t,t2,t3,one,two,cmt,x,Rem = {},{},{},0,0,0,1,nil;
      local boxOpens,boxClose,RemStr,xt = 0,0,nil,nil;
      local SingleLine,boxActiv,Inside = nil,nil,nil;
      local LineCom,LineComM,LineComRemove = 0,nil,nil;
      ----
      for val in (text..'\n'):gmatch(".-\n")do;
        t3[#t3+1]=val:gsub('\n',(' '):rep(2)..'\n');
      end;
      text = table.concat(t3);
      ----
      for val in text:gmatch(".") do;
        t[#t+1] = val;
      end;
      ----
      for i = 1,#t do;
        --------------------
        if Rem then;
          local Cls = RemStr:match('.',x);
          if Cls == t[i] and x == #RemStr then RemStr = nil Rem = nil Cls=nil end;
          if Cls == t[i] then x = x + 1 end;
          if Cls ~= t[i] then x = 1 end;
          t[i] = "";
        end;
        --------------------
        --------------------
        if LineComRemove then;
          if t[i] ~= '\n' then;
            t[i] = "";
          else;
            LineComRemove = nil;
          end;
        end;
        --------------------
        if LineCom == 1 and t[i] ~= "-" then LineCom = 0 end;
        if one==0 and two==0 and not boxActiv and not Rem and not LineComRemove then;
          if LineCom >= 3 then;--4 simb>=
            if t[i] == "[" or t[i] == "=" and LineComM == 1 then;
                if t[i] == "[" then;
                  LineCom = 0;
                  LineComM = nil;
                end;
            else;
                t[i-0],t[i-1],t[i-2],t[i-3] = '','','','';
                LineComRemove = true;
                LineCom,LineComM = 0,nil;
                boxOpens,boxClose,SingleLine,cmt,t2 = 0,0,nil,0,{};
            end;
          end;
          if LineCom == 2 then;
            LineCom = LineCom+1;
            if t[i] == "[" then LineComM = 1 end;
          end;
          if t[i] == "-" and LineCom < 2 and not LineComRemove then;
            LineCom = LineCom+1;
          end;
        end; 
        if not LineComRemove then;
        --------------------------------------------------
          --------------------------------------------------
          if Inside and (t[i] == "'" or t[i] == '"')then xt=t[i]t[i]=""end;
          if Inside and (t[i] ~= "'" or t[i] ~= '"')then Inside = nil end;
          if (one >= 1 or two >= 1)and t[i] == "\\" then Inside = true end;
          
          if t[i] == "'" and two == 0 and not boxActiv then;
            if one > 0 then one = 0 else one = 1 end;
          end;
          ---
          if t[i] == '"' and one == 0 and not boxActiv then;
            if two > 0 then two = 0 else two = 1 end;
          end;
          ---
          if t[i] ~= '['then boxOpens = 0 end;
          if t[i] ~= ']'then boxClose = 0 end;
          if t[i] ~= "-" then cmt = 0 end;
          ---
          if t[i] == '[' and one == 0 and two == 0 and not boxActiv and #t2 < 2 then;
            boxOpens = boxOpens+1;
            if boxOpens >= 2 then;
                boxOpens = 0;
                boxActiv = true;
            end;
          end;
          --- 
          if t[i] == ']' and one == 0 and two == 0 and boxActiv then;
            boxClose = boxClose+1;
            if boxClose >= 2 then;
               boxClose = 0;
               boxActiv = nil;
            end;
          end;
          ---
          if SingleLine then t2[1],t2[2] = '-','-'end;
          
          if one == 0 and two == 0 and not boxActiv and t[i] == '-' then;
             cmt = cmt + 1;
             if cmt >= 2 then; SingleLine = true; cmt=0 end;
          end;
          ---
          if SingleLine and #t2>=2 then;
            if (t[i] == '[' or t[i] == '=') and #t2 >= 3 then;
                t2[#t2+1] = t[i];
            elseif t[i] ~= '[' and t[i] ~= '=' and #t2 >= 3 then;
               t2 = {};
               SingleLine = nil;
            end;
            ---
            if t[i] == '[' and #t2==2 then;
                t2[3] = t[i];
            elseif #t2 == 2 and t[i] ~= '[' then;
                t2 = {};
                SingleLine = nil;
            end;
            ---
            if #t2 > 3 and t[i] == '[' then;
                Rem = true;
                for ii = 1,#t2 do;
                  t[i-(ii-1)] = '';
                end;
                RemStr = table.concat(t2):gsub('%s',''):gsub('%-',''):gsub('%[',']');
                t2 = {};
                SingleLine = nil;
                if not RemStr or RemStr=='' then Rem = nil end;
            end;
          end;
        -------
        end;--LineComRemove
        if xt then t[i]=xt xt=nil end;
      end;--End for #t
      text = table.concat(t);
      ----
      t3 = {};
      for val in text:gmatch(".-\n")do;
        t3[#t3+1]=val:gsub('%s%s\n','\n');
      end;
      ----
      return table.concat(t3);
    end;
    --===================================
    
    --filename = [[C:\\...]]
     
    local file = io.open(filename..'.lua','r');
    if not file then return end;
    local text = file:read('a');
    file:close();
    -----
    text = DeleteAll_Comments(text);
    -----
    file = io.open(filename..'_.lua','w');
    file:write(text)
    file:close();
    --=================================== 
Удаления всех комментариев из скрипта.lua
 
Цитата
Anton написал:
Цитата
Archie_ написал:
если вам удастся его поломать, то дайти мне знать
 
Код
   --[[ parse me ]]-- 
 function   test ()
    print ( " \" --[[" )
    print ( " \" ]]--" )
 end 

test()
  
Код
    local function DeleteAll_Comments(text);
      ----
      local t,t2,t3,one,two,cmt,x,Rem = {},{},{},0,0,0,1,nil;
      local boxOpens,boxClose,RemStr = 0,0,nil;
      local SingleLine,boxActiv,Inside = nil,nil,nil;
      local LineCom,LineComM,LineComRemove = 0,nil,nil;
      ----
      for val in (text..'\n'):gmatch(".-\n")do;
        t3[#t3+1]=val:gsub('\n',(' '):rep(2)..'\n');
      end;
      text = table.concat(t3);
      ----
      for val in text:gmatch(".") do;
        t[#t+1] = val;
      end;
      ----
      for i = 1,#t do;
        --------------------
        if Rem then;
          local Cls = RemStr:match('.',x);
          if Cls == t[i] and x == #RemStr then RemStr = nil Rem = nil Cls=nil end;
          if Cls == t[i] then x = x + 1 end;
          if Cls ~= t[i] then x = 1 end;
          t[i] = "";
        end;
        --------------------
        --------------------
        if LineComRemove then;
          if t[i] ~= '\n' then;
            t[i] = "";
          else;
            LineComRemove = nil;
          end;
        end;
        --------------------
        if LineCom == 1 and t[i] ~= "-" then LineCom = 0 end;
        if one==0 and two==0 and not boxActiv and not Rem and not LineComRemove then;
          if LineCom >= 3 then;--4 simb>=
            if t[i] == "[" or t[i] == "=" and LineComM == 1 then;
                if t[i] == "[" then;
                  LineCom = 0;
                  LineComM = nil;
                end;
            else;
                t[i-0],t[i-1],t[i-2],t[i-3] = '','','','';
                LineComRemove = true;
                LineCom,LineComM = 0,nil;
                boxOpens,boxClose,SingleLine,cmt,t2 = 0,0,nil,0,{};
            end;
          end;
          if LineCom == 2 then;
            LineCom = LineCom+1;
            if t[i] == "[" then LineComM = 1 end;
          end;
          if t[i] == "-" and LineCom < 2 and not LineComRemove then;
            LineCom = LineCom+1;
          end;
        end; 
        if not LineComRemove then;
        --------------------------------------------------
          --------------------------------------------------
          if Inside and (t[i] == "'" or t[i] == '"')then t[i] = "" end;
          if Inside and (t[i] ~= "'" or t[i] ~= '"')then Inside = nil end;
          if (one >= 1 or two >= 1)and t[i] == "\\" then Inside = true end;
          
          if t[i] == "'" and two == 0 and not boxActiv then;
            if one > 0 then one = 0 else one = 1 end;
          end;
          ---
          if t[i] == '"' and one == 0 and not boxActiv then;
            if two > 0 then two = 0 else two = 1 end;
          end;
          ---
          if t[i] ~= '['then boxOpens = 0 end;
          if t[i] ~= ']'then boxClose = 0 end;
          if t[i] ~= "-" then cmt = 0 end;
          ---
          if t[i] == '[' and one == 0 and two == 0 and not boxActiv and #t2 < 2 then;
            boxOpens = boxOpens+1;
            if boxOpens >= 2 then;
                boxOpens = 0;
                boxActiv = true;
            end;
          end;
          --- 
          if t[i] == ']' and one == 0 and two == 0 and boxActiv then;
            boxClose = boxClose+1;
            if boxClose >= 2 then;
               boxClose = 0;
               boxActiv = nil;
            end;
          end;
          ---
          if SingleLine then t2[1],t2[2] = '-','-'end;
          
          if one == 0 and two == 0 and not boxActiv and t[i] == '-' then;
             cmt = cmt + 1;
             if cmt >= 2 then; SingleLine = true; cmt=0 end;
          end;
          ---
          if SingleLine and #t2>=2 then;
            if (t[i] == '[' or t[i] == '=') and #t2 >= 3 then;
                t2[#t2+1] = t[i];
            elseif t[i] ~= '[' and t[i] ~= '=' and #t2 >= 3 then;
               t2 = {};
               SingleLine = nil;
            end;
            ---
            if t[i] == '[' and #t2==2 then;
                t2[3] = t[i];
            elseif #t2 == 2 and t[i] ~= '[' then;
                t2 = {};
                SingleLine = nil;
            end;
            ---
            if #t2 > 3 and t[i] == '[' then;
                Rem = true;
                for ii = 1,#t2 do;
                  t[i-(ii-1)] = '';
                end;
                RemStr = table.concat(t2):gsub('%s',''):gsub('%-',''):gsub('%[',']');
                t2 = {};
                SingleLine = nil;
                if not RemStr or RemStr=='' then Rem = nil end;
            end;
          end;
        -------
        end;--LineComRemove
      end;--End for #t
      text = table.concat(t);
      ----
      t3 = {};
      for val in text:gmatch(".-\n")do;
        t3[#t3+1]=val:gsub('%s%s\n','\n');
      end;
      ----
      return table.concat(t3);
    end;
    --===================================
    
    --filename = [[C:\\...]]
    
    local file = io.open(filename..'.lua','r');
    if not file then return end;
    local text = file:read('a');
    file:close();
    -----
    text = DeleteAll_Comments(text);
    -----
    file = io.open(filename..'_.lua','w');
    file:write(text)
    file:close();
    --=================================== 
Удаления всех комментариев из скрипта.lua
 
Цитата
Anton написал:
Ваш парсер относится к классу LL(k), при этом грамматика луа леворекурсивная, то есть в принципе всегда можно подобрать такой скрипт, на котором ваш парсер сфейлит. При этом, поскольку он полностью весь луа не парсит, он сам этого не заметит и выдаст мусор (а должен сказать "не понимаю вот эту вот конструкцию"). Вы верно заметили выше, что лучше день потерять, потом за пять минут долететь, только теряете дни не в ту сторону. Писать LL(k) для луа бессмысленно, как его ни усложняй. Парсер должен быть полным и в данном случае построен по принципу рекурсивного спуска, если вы конечно не хотите загнаться и написать GLR, потому что LALR на грамматике из документации тоже не строится, конфликты возникают. Отсюда этапы пути: а) привести грамматику к форме Грейбах; б) доказать, что получилась грамматика, эквивалентная исходной; в) только потом браться за код (по форме Грейбах уже очень просто написать рекурсивный спуск). Или воспользоваться каким-то генератором, хоть яком, хоть бизоном, хоть этим на яве, забыл как его, хотя с ними геморроя будет больше пожалуй, чем при чисто ручном подходе.
Я не программист и все эти ваши слова мне толком ничего не дали, а программистом прочитавши про эти слова сразу я не стану, (хотя знаний и поприбавится, если найду время почитать).))
В предыдущем сообщении я пытался сказать, что в отличии от кода nikolz, мой не ломается на элементарных комментариях.
Да - мой код может быть и не красивый с точки зрения программиста, и да - может быть вы и правы, и где то мой код может быть и сфейлит и я этого не отрицаю. Но - но он перебирает весь файл по символьно и вычисляет только комменты вне строк(это важно) и ищет обязательный выход из многострочного коммента по символу входа в него. И как я его не пытался сломать, у меня не получилось и что то мне подсказывает что и не получится, но может я и ошибаюсь и если вам удастся его поломать, то дайти мне знать.
Удаления всех комментариев из скрипта.lua
 
nikolz, А теперь обработайте все эти примеры вот этой функцией
Код
    local function DeleteAll_Comments(text);
        ----
        text = text..'\n';
        local t,t2,t3,one,two,cmt,x,Rem = {},{},{},0,0,0,1,nil;
        local boxOpens,boxClose,RemStr = 0,0,nil;
        local SingleLine,boxActiv = nil,nil;
        local LineCom,LineComM,LineComRemove = 0,nil,nil;
        ----
        for val in text:gmatch(".-\n")do;
            t3[#t3+1]=val:gsub('\n',(' '):rep(2)..'\n');
        end;
        text = table.concat(t3);
        ----
        for val in text:gmatch(".") do;
            t[#t+1] = val;
        end;
        ----
        for i = 1,#t do;
            --------------------
            if Rem then;
                local Cls = RemStr:match('.',x);
                if Cls == t[i] and x == #RemStr then RemStr = nil Rem = nil Cls=nil end;
                if Cls == t[i] then x = x + 1 end;
                if Cls ~= t[i] then x = 1 end;
                t[i] = "";
            end;
            --------------------
            --------------------
            if LineComRemove then;
                if t[i] ~= '\n' then;
                    t[i] = "";
                else;
                    LineComRemove = nil;
                end;
            end;
            --------------------
            if LineCom == 1 and t[i] ~= "-" then LineCom = 0 end;
            if one==0 and two==0 and not boxActiv and not Rem and not LineComRemove then;
                if LineCom >= 3 then;--4 simb>=
                    if t[i] == "[" or t[i] == "=" and LineComM == 1 then;
                        if t[i] == "[" then;
                            LineCom = 0;
                            LineComM = nil;
                        end;
                    else;
                        t[i-0],t[i-1],t[i-2],t[i-3] = '','','','';
                        LineComRemove = true;
                        LineCom,LineComM = 0,nil;
                        boxOpens,boxClose,SingleLine,cmt,t2 = 0,0,nil,0,{};
                    end;
                end;
                if LineCom == 2 then;
                    LineCom = LineCom+1;
                    if t[i] == "[" then LineComM = 1 end;
                end;
                if t[i] == "-" and LineCom < 2 and not LineComRemove then;
                    LineCom = LineCom+1;
                end;
            end; 
            if not LineComRemove then;
            --------------------------------------------------
                --------------------------------------------------
                if t[i] == "'" and two == 0 and not boxActiv then;
                    if one > 0 then one = 0 else one = 1 end;
                end;
                ---
                if t[i] == '"' and one == 0 and not boxActiv then;
                    if two > 0 then two = 0 else two = 1 end;
                end;
                ---
                if t[i] ~= '['then boxOpens = 0 end;
                if t[i] ~= ']'then boxClose = 0 end;
                if t[i] ~= "-" then cmt = 0 end;
                ---
                if t[i] == '[' and one == 0 and two == 0 and not boxActiv and #t2 < 2 then;
                    boxOpens = boxOpens+1;
                    if boxOpens >= 2 then;
                        boxOpens = 0;
                        boxActiv = true;
                    end;
                end;
                --- 
                if t[i] == ']' and one == 0 and two == 0 and boxActiv then;
                    boxClose = boxClose+1;
                    if boxClose >= 2 then;
                         boxClose = 0;
                         boxActiv = nil;
                    end;
                end;
                ---
                if SingleLine then t2[1],t2[2] = '-','-'end;
                
                if one == 0 and two == 0 and not boxActiv and t[i] == '-' then;
                   cmt = cmt + 1;
                   if cmt >= 2 then; SingleLine = true; cmt=0 end;
                end;
                ---
                if SingleLine and #t2>=2 then;
                    if (t[i] == '[' or t[i] == '=') and #t2 >= 3 then;
                        t2[#t2+1] = t[i];
                    elseif t[i] ~= '[' and t[i] ~= '=' and #t2 >= 3 then;
                       t2 = {};
                       SingleLine = nil;
                    end;
                    ---
                    if t[i] == '[' and #t2==2 then;
                        t2[3] = t[i];
                    elseif #t2 == 2 and t[i] ~= '[' then;
                        t2 = {};
                        SingleLine = nil;
                    end;
                    ---
                    if #t2 > 3 and t[i] == '[' then;
                        Rem = true;
                        for ii = 1,#t2 do;
                            t[i-(ii-1)] = '';
                        end;
                        RemStr = table.concat(t2):gsub('%s',''):gsub('%-',''):gsub('%[',']');
                        t2 = {};
                        SingleLine = nil;
                        if not RemStr or RemStr=='' then Rem = nil end;
                    end;
                end;
            -------
            end;--LineComRemove
        end;--End for #t
        text = table.concat(t);
        ----
        t3 = {};
        for val in text:gmatch(".-\n")do;
            t3[#t3+1]=val:gsub('%s%s\n','\n');
        end;
        ----
        return table.concat(t3);
    end;
    --===================================
    
    
    
    --filename = [[C:\\...]]
    
    local file = io.open(filename..'.lua','r');
    if not file then return end;
    local text = file:read('a');
    file:close();
    -----
    text = DeleteAll_Comments(text);
    -----
    file = io.open(filename..'_.lua','w');
    file:write(text)
    file:close();
    --=================================== 
Удаления всех комментариев из скрипта.lua
 
Цитата
nikolz написал:
если не умеете запускать то могу выложить скомпилированный или exe файл например для Luajit.
Я умею запускать!
Я запустил и увидел что ваш код не работает, а вот вы походу читать не умеете, я вам все ошибки подробно расписал, т.е не все, а первые встретившейся, а всяких загадочных фраз в коде/комментах может быть гораздо больше !
Цитата
nikolz написал:
если  есть у вас потребность в таком скрипте.
Была - я функцию написал (в сообщении 12) и она пока на пять отрабатывает. (ошибок пока не выявлено, тестил со всякими экстремальными фразами и выражениями)
Цитата
nikolz написал:
могу выложить скрипт до и послеобъем скрипта 1000 операторов
--------------------------
напишите конкретно что у вас не работает
или выложите свой файл я вам его обработаю и опубликую.
Для чего вылаживать мне код до и после, я и так все вижу. И я написал и подробно расписал что именно не работает у вас в коде, прочитайте внимательно мое предыдущее сообщения и поймете.
----------
Ваш код работает до тех пор, пока в коде не встретится фраза "--" т.е вот фраза кода
Код
if arg == true then arg2 = "--" end
Вот вам код из одной строки, обработайте его своей функцией что бы не сломать код.
Или пока не встретится в многострочном комментарии конец вложенного комментария,   т.е вот фраза кода (комментарий)
Код
--[==[  чтобы использовать многострочный  коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный  коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент   --[=[  вложенный коммент --]=] ]] --]==]
Вот обработайте мне вот этот комментарий своей функцией.
Цитата
nikolz написал:
у Вас в первом примере завершающий символ в конце строки
Вот вы сами уже начинаете осознавать не работа способность вашей функции. потому как следить где закрылся коммент , это точно бред.
Вот вам этот же комментарий, но завершающий символ не в конце строки
Код
--[==[ чтобы использовать многострочный коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент --[=[ вложенный коммент --]=] ]] 
--]==]
Вот обработайте мне вот этот комментарий своей функцией, он по вашему совету закрылся в начале строки!
Так что ваш код работает на повезет - не повезет, так что для меня это полностью не работа способный код. Лучше тогда вручную удалить все, чем испытывать судьбу.
Цитата
nikolz написал:
или выложите свой файл я вам его обработаю и опубликую.
Хорошо)) Вот вам файл. Обработайте его своей функцией.))
Код
local bla = 10; 

if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; -- значение активно


--[==[  чтобы использовать многострочный  коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный  коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент   --[=[  вложенный коммент --]=] ]]
--]==]

local bla = 15
Я ожидаю получить вот такой результат
Код
local bla = 10; 

if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; 



local bla = 15
А получаю вот это((
Код
local bla = 10 
if bla == 10 then bla = '
if bla == '
открыть многострочный коммент и фразу ]] что бы закрыть
многострочный коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е.
local bla = 15
Комментарий не удален, код унечтожен!!!
----------------------

Так что если код будет очень большой и в коде будут фразы с двумя тире и этих фраз если будет много в коде и не будет копии этого кода, ТО вас за эту функцию (прошу прощения) мало будет прибить. Так как ваша функция уничтожит часть кода.

Скрытый текст
Удаления всех комментариев из скрипта.lua
 
Цитата
nikolz написал:
выкладываю скрипт (nk_com.lua):
Код
   -- удаляем комментарии и лишние пробелы 
 --пример вызова для файла C:\NK\nk_bot.lua: nk_com.lua C:\NK\nk_bot 
 --результат в  C:\NK\nk_bot_.lua: 
 -------------------- 
 if  arg[ 1 ]  then 
out =  io.open (arg[ 1 ] .. "_.lua","w")
 ---------------- 
 for  s1  in   io.lines (arg[ 1 ] .. ".lua")  do 
    local  len =  string.len (s1);     local  s =  "" ;
    for  m =  1 ,len  do 
       local  x =  string.byte (s1,m)
       if  x =  =  59   then  x =  32   end 
       if  x =  =  32   then 
          if  s~ =  ""   and  m~ = len  then 
             if  f =  =  nil   then  s = s ..  string.char (x) f =  1   end 
          end 
       else   if  x >  =  32   then  s = s ..  string.char (x); f =  nil ;  end    end 
    end 
    if   e  then  s =  nil ; end 
    if  s2 =  =  "--]]"   then  e =  nil ;  else     if  s2 =  =  "--[["   then  e =  1 ; s =  nil ;  end   end      -  - многострочный комментарий
    if  s  then 
       local  m =  string.find (s,"% - % - ")
       if  m  then 
       if  m =  =  1   then  s =  nil   else   s =  string.sub (s, 1 ,m -  1 )
       end    end 
       if  s  and  s~ =  ""   then  out:write(s .. "\n")     end 
      end 
 end 
out:close();
 end 
  
Нет - Вообще не работает !  Мои первые нерабочие скрипты, которые выше 12-го сообщения работают лучше. (В 12-м сообщении код вроде коректно работает, пока ошибок не обнаружено)
В моем первом сообщении есть примеры комментариев, так ваш код не один комментарий не обработал коректно.

Вот примеры ошибок вашего кода:
Скрытый текст
Удаления всех комментариев из скрипта.lua
 
https://prnt.sc/shecfs

https://prnt.sc/sheayt
Удаления всех комментариев из скрипта.lua
 
Цитата
Александр М написал:
но как-то справляюсь. :)
Я не спорю, все как то справляются)), но согласись что потратить десять минут вместо сорока к примеру, это лучше, как не крути.

Цитата
Александр М написал:
некорректно отрабатывали многострочные комментарии.
Да - при прочитывании кавычек я не учел что где то в однострочном комментарии может находится "одна" кавычка и она ломала весь счет. Исправлено - теперь должно все работать правильно.


Все предыдущие функции выше работают не коректно!

Функция для удаления всех комментариев в файле.lua,  
Скрытый текст
Удаления всех комментариев из скрипта.lua
 
Да, к сожалению не коректно работают.((
Удаления всех комментариев из скрипта.lua
 
Цитата
Александр М написал:
По времени гораздо быстрее удалить многострочные вручную, а потом скриптом однострочные, чем писать парсер или искать готовый. Проверено.
А если скрипт в несколько тысяч строк ?  Так что плохо проверено, лучше потратить несколько часов (дней может даже) и потом все быстро делать, чем постоянно тратить кучу времени на удаления оных.

---------------------
Функция для удаления всех комментариев в файле.lua, может кому пригодится.

Скрытый текст
Удаления всех комментариев из скрипта.lua
 
Цитата
Anton написал:
Я вам помог, если что
Спасибо! Что б вам так помогали!!!
Удаления всех комментариев из скрипта.lua
 
Цитата
Anton написал:
А если в файле нет комментариев вообще, то и strpy сработает безошибочно.
Я же написал , что
Цитата
Archie_ написал:
Если Учесть  что в коде нету многострочных комментариев, то эта функция сработает в любой ситуации правильно и без ошибочно !!!
Так что не важно есть комментарии или нет, Функция всегда сработает правильно при условии, что нету много-стр. коммента, если я не прав, то дайте мне знать, на чем она сломалась.


Цитата
Anton написал:
Или вы ждали, что вам готовый код дадут в виде вспоможения?
А вы точно читали мое первое сообщение?
Цитата
Archie_ написал:
Ребят подскажите пожалуйста, как удалить все комментарии из файла lua, МОЖЕТ БЫТЬ ЕСТЬ У КОГО УЖЕ НАПИСАННАЯ ФУНКЦИЯ. Поиск  в Google не дал результатов.
Удаления всех комментариев из скрипта.lua
 
Цитата
Anton написал:
это все колхоз и работать будет только в простых случаях
Если Учесть  что в коде нету многострочных комментариев, то эта функция сработает в любой ситуации правильно и без ошибочно !!!

Цитата
Anton написал:
Грамматика луа есть в документации, дело за "малым".

Прошу прощения за тавтологию, но ей богу ведёте себя как бабы (прошу прощения, не в коем случае не хочу обидеть вас) , я прекрасно понимаю, что нужно почитать мануал и порыться в гугле, и я этим и занимаюсь, а пока моих знаний недостаточно, поэтому я и попросил тут помощи. Так что если не можете помочь, то пройдите мимо и не умничайте, ну или просто возьмите и помогите.
Удаления всех комментариев из скрипта.lua
 
Для однострочного удалось написать, но он не понимает многострочных и если они* встретятся на пути, то они* будут поломаны.
Эта функция сработает правильно, если в строках не будет многострочных комментариев.
Теперь осталось написать функцию для удаления во всем коде многострочных комментов, но тут все точно выше моих сил, даже не знаю с какой стороны подойти к этому.

*многострочные

Код
    local function DeleteSingleLine_Comments(str);
        local boxOpens,boxClose,boxActiv = 0,0,nil;
        local one,two,cmt,Str,rem,n = 0,0,0,'',nil,nil;
        for val in string.gmatch(str,".") do;
           if rem then val = '' end;
           if val == '"' and one == 0 and not boxActiv then;
               if two > 0 then two = 0 else two = 1 end;
           end;
           if val == "'" and two == 0 and not boxActiv then;
               if one > 0 then one = 0 else one = 1 end;
           end;
           if val ~= '['then boxOpens = 0 end;
           if val ~= ']'then boxClose = 0 end;
           if val ~= "-" then cmt = 0 end;
           if val == '[' and one == 0 and two == 0 and not boxActiv then;
               boxOpens = boxOpens+1;
               if boxOpens >= 2 then;
                    boxOpens = 0;
                    boxActiv = true;
               end;
           end;
           if val == ']' and one == 0 and two == 0 and boxActiv then;
               boxClose = boxClose+1;
               if boxClose >= 2 then;
                    boxClose = 0;
                    boxActiv = nil;
               end;
           end;
           if one == 0 and two == 0 and not boxActiv and val == '-' then;
              cmt = cmt + 1;
              if cmt >= 2 then;rem = true;end;
           end;
           Str = Str..val;
        end;
        if str:match('\n%s-$')or str:match('\\n%s-$') then;
            n='\n';
        end;
        if str ~= Str then;
            Str = Str:gsub('--$',(n or ''));
        end;
        return Str;
    end;
Удаления всех комментариев из скрипта.lua
 
Привет всем!
Ребят подскажите пожалуйста, как удалить все комментарии из файла lua, может быть есть у кого уже написанная функция. Поиск  в Google не дал результатов.
Попытался написать сам, на первый взгляд вроде бы просто, но оказалось не все так просто, потому как в середине строки может встретится что то типа того ***   или еще чего и это оказалось выше моих сил.
Спасибо!

***
Код
if bla then bla = '--' end -- коммент
if bla then bla = 'D --' end -- коммент


или

--[[ bla bla bla bla bla --[==[ bla bla bla 
bla bla bla bla -- bla bla bla  -- bla bla --]=] bla 
bla bla bla bla --]]

Как из таблицы получить значения самое близкое к указанному?
 
Код
   
    local t = { 1.235, 3.215, 4.953, 5.531, 11.845, 14.312, 15.359, 15.498 }
  
    local function nearest(v,tbl);
        local x,val;
        for i = 1, #tbl do;
            local dlt = math.abs(v-tbl[i]);
            if not x or dlt < x then;
                x = dlt;
                val = tbl[i];
            end;
        end;
        return val;
    end;
    
    print( nearest( 8   , t ) )
    print( nearest( 14.5, t ) )
    print( nearest( 2   , t ) )
    print( nearest( 2.7 , t ) )
Как из таблицы получить значения самое близкое к указанному?
 
Привет всем!
Подскажите пожалуйста, как из таблицы  получить значения самое близкое к указанному?
То есть:
например есть таблица T и есть определенное значение val
Код
T = {1.235,3.215,4.953,5.531,11.845,14.312,15.359,15.498}
val = 12
Так вот, значение val равно 12, значит из таблицы надо вытащить 11.845
если val равно 14,5 , значит из таблицы надо вытащить 14.312
если val равно 2, значит из таблицы надо вытащить 1.235
если val равно 2,7 значит из таблицы надо вытащить 3.215

Спасибо!
Функцию с двоеточием в таблицу, как запихнуть функцию string в таблицу.
 
И возможно ли это вообще?
Функцию с двоеточием в таблицу, как запихнуть функцию string в таблицу.
 
Привет всем!
Подскажите пожалуйста как запихнуть функцию string  в таблицу.
Таблица нужна для того, что бы функцию положить в модуль. Конечно можно и обойтись без таблицы, но по таблице я еще определяю модуль.

Вот  в примере "foo1" в таблице, а "foo2" string, так вот - как эти функции объединить?
Код
   T={}
   function T.foo1(x)
       return string.reverse(x)
   end
   T.foo1("123") -- вернет 321
   
   
   function string:foo2()
       return string.reverse(self)
   end
   ("123"):foo2() -- вернет 321
Пытаюсь сделать так, но это не работает
Код
   T={}
   function T.string:foo3()
       return string.reverse(self)
   end
Спасибо.
Строку в Математическое выражение.
 
loadstring()  по каким то причинам (не знаю по каким) у меня не работает, но все равно вы меня направили в нужном направлении.
Спасибо большое!
Решил с помощью load();
Код
    local STRING = "5*5+5"
    
    NUMB = load("return "..STRING)();
Строку в Математическое выражение.
 
Привет ребят!
Подскажите как строку превратить в математическое выражение, т.е. есть строка "5*5" или "15/3" или "15*7/3" и мне надо получить ответы этих выражений.
tonumber() со строками не работает почему то.
Подскажите пожалуйста, кто знает, что можно придумать, как выйти из этого положения. Буду раб любым примерам. Спасибо!
Код
--Работает
tonumber(5*5) 

--Не работает ((
tonumber("5*5") 
Подменить число в строке
 
Подскажите пожалуйста, как подменить число в строке.
Есть вот такая строка
Код
"ShowMix 1 0.6667 0.5 1 0.5 0 0.6667 0"
и надо подменить второе число в строке на другое, т.е. первое 0.6667 на какое то другое, как это осуществить?
Спасибо
Сократить запись
 
Всем Привет!
Извините меня за глупый вопрос, но все же спрошу, а вдруг.))
Подскажите пожалуйста, возможно ли в луа как то сокращать записи?
Например:
Есть у нас функция, которая возвращает одно значение, и мне надо отнять или прибавить к этому значению какую то число, то я делаю вот так
Код
    function foo()
        local x = 150
        return x
    end
    --------------

    bla = foo()-50
а если у нас функция возвращает несколько значений, то вопрос: возможно ли это записать в одну строку, а не так
Код
    function foo2()
        local x,y,w,h = 150,150,500,300
        return x,y,w,h
    end
    
    
    x,y,w,h = foo2()
    x,y,w,h = x-50,y-50,w-100,h-100

а примерно как то так
Код
x,y,w,h = foo2(),-50,-50,-100,-100
спасибо!
Вернуть строку
 
Привет всем!
Подскажите пожалуйста знающие люди, как вернуть из строки точное значение.
Есть такая строка(текст)
И мне надо вернуть значение строки ID, но match варачивает, в данном случае значение FXID, а как вернуть точное значение ID?
Строки могут располагаться в любом порядке.
Код
local x=[[
FXID {88856CCC-783B-4270-B18E-9F80FB9FB319}
IID {14856CCC-783B-4270-B18E-9F80FB9FB319}
ID {1D4F3150-6FC3-42DC-A584-4DC6F925AB7A}
SID {554F3150-6FC3-42DC-A584-4DC6F925AB7A}
]]
Я делаю вот так:
Код
 id = string.match(x, "ID ({.-})");
и получаю
Код
{88856CCC-783B-4270-B18E-9F80FB9FB319}
а надо
Код
{1D4F3150-6FC3-42DC-A584-4DC6F925AB7A}
Спасибо!!!
Редактирование архивов скриптом lua
 
Привет всем!
Подскажите пожалуйста, возможно ли скриптом lua редактировать архивы .rar,.zip и т.д.?
Т.е. есть архив с файлами, и в этом архиве надо отредактировать текстовый документ (имя.txt конечно же известно)
Заранее Спасибо!!!
Одинаковые значения в таблицы lua
 
Ребят, подскажите пожалуйста, не как не могу сообразить, как получить из таблицы наиболее повторяющееся число?

например:
Код
T1 = {25,15,25,35,65,25,84,61,25,97,25}
из этой таблицы надо вытащить значения 25
 
T2 = {15,54,87,15,89,64,15,57,15,96,15}
из этой таблицы надо вытащить значения 15
 
T3 = {23,55,46,23,23,23,55,23,23,47,23}
из этой таблицы надо вытащить значения 23
Таблица в функцию. Lua
 
Цитата
Николай Камынин написал:
Вы сами поняли что написали?У вас в определении функции Restore() нет формальных параметрова в ее вызове Restore(slot_2) появляются
Я то понял, что написал, а вы если помочь не можете, то и не паясничайте!!!
Извините, что в функцию в примере параметр забыл вписать, но вы и так прекрасно все поняли, что я написал, а если не поняли, то так понятней?
Код
function Save (slot)          
    local  t  =  {}
    _G[slot]  =  t
    for  i  = 1 , количества_чего_то  do 
        t[i] = Get_Моя_Функция(которая сохраняется)
    end  
end  

function   Restore (Slot) 
    local  t  =  _G[Slot]
    for  i  =   1 ,  # t  do   
        Set_Моя_Функция_которая_восстанавливает(t[i])
        --t[i]  =   nil   -- если надо очистить 
    end  
end  

  
Код
Save(slot_1)    
   код
Save(slot_2) 
   код
Restore(slot_2)
   код
Save(slot_3) 
   код
Restore(slot_3) 
   код 
Restore(slot_1) 
Таблица в функцию. Lua
 
Решил вот так:
Код
function Save(slot)     
    local t = {}
    _G[slot] = t
    for i = 1, количества_чего_то do
        t[i] = Get_Моя_Функция(которая сохраняется)
    end 
end 

function Restore() 
    local t = _G[Slot]
    for i = 1, #t do  
        Set_Моя_Функция_которая_восстанавливает(t[i])
        t[i] = nil -- если надо очистить
    end 
end 
Код
Save(slot_1) 
   код
Save(slot_2) 
   код
Restore(slot_2)
   код
Save(slot_3) 
   код
Restore(slot_3) 
   код 
Restore(slot_1)
Таблица в функцию. Lua
 
Цитата
BlackBoar написал:
У таблицы обьявленой внутри функции областью видимости (по определению) будет эта самая функция.
Почему? Я же не локально ее объявил
Цитата
BlackBoar написал:
Непонятно какого эффекта вы добиваетесь, вам нужны временные обьекты, вам надо эти таблицы возвращать из функции, еще что-то?Функция например может работать с обьектами обьявленными один раз где-то в начале модуля, как вариант.
Нет возвращать мне не надо,
У меня две функции плана Сохранить, восстановить, одна функция запоминает информацию в таблицу, а вторая восстанавливает из таблицы эту информацию

Код
function Save()     
    Table = {}
    for i = 1, количества_чего_то do
        Table[i] = Get_Моя_Функция(которая сохраняется)
    end 
end 

function Restore() 
    for i = 1, #Table do  
        Set_Моя_Функция_которая_восстанавливает(Table[i])
    end 
end


И в процессе работы скрипта сохранений восстановлений может быть целая куча, и я хочу что бы в скобочках объявляемой функции просто прописывался слот и всё
Примерно как то так:
Код
Save(slot_1) 
   код
Save(slot_2) 
   код
Restore(slot_2)
   код
Save(slot_3) 
   код
Restore(slot_3) 
   код
Restore(slot_1)
Сейчас у меня это работает вот так для незапутанного сохранения
Код
function Save()     
    Table = {}
    for i = 1, количества_чего_то do
        Table[i] = Get_Моя_Функция(которая сохраняется)
    end 
end 

function Restore() 
    for i = 1, #Table do  
        Set_Моя_Функция_которая_восстанавливает(Table[i])
        Table[i] = nil -- если надо очистить
    end 
end 
Код
Save()
 код   
Restore() 
 код
Save()   
 код
Restore()
А вот так для запутанного
Код
slot_1 = {}
Save(slot_1)   
 код
slot_2 = {}
Save(slot_2) 
   код
Restore(slot_2)
   код
slot_3 = {}
Save(slot_3) 
   код
Restore(slot_3) 
   код
Restore(slot_1)
И я хочу это превратить в это
Код
Save(slot_1) 
   код
Save(slot_2) 
   код
Restore(slot_2)
   код
Save(slot_3) 
   код
Restore(slot_3) 
   код Restore(slot_1)
Таблица в функцию. Lua
 
Всем Привет!
Подскажите пожалуйста возможно ли как то, вот такое реализовать, и если возможно то как ?
Есть функция, внутри которой заполняется таблица
И возможно ли как то сделать, что бы не писать несколько функций, менять таблицы в функции
Например что бы это выглядело примерно как то так.
Код
function Bla(Table) 
    Table = {} 
    for i = 1, 10 do
        Table[i] = #Table + 1
    end 
end 
Bla(Table_1) 
Bla(Table_2) 
Bla(Table_3) 
Конечно можно сделать вот так
Код
function Bla(Table) 
    for i = 1, 10 do
        Table[i] = #Table + 1
    end 
end 

Table_1 = {}
Bla(Table_1) 

Table_2 = {}
Bla(Table_2) 

Table_3 = {}
Bla(Table_3) 

Но хотелось бы что бы все манипуляции по объявлению таблиц происходили внутри функции и не приходилось каждый раз объявлять таблицу, перед вызовом функции
Работа со строками LUA
 
Here it is not necessary to remove[it should be removed]this is also not necessary to remove(it should be removed)

на выходе надо получить вот такие строки
Код
Here it is not necessary to removethis is also not necessary to remove  
 Here it is not necessary to removethis is also not necessary to remove

В скобках может быть что угодно
Работа со строками LUA
 
Привет!
Ребят, подскажите пожалуйста, кто знает, как удалить часть строки
то есть: есть строка и в ней есть часть в квадратных скобках и/или в круглых скобках и надо удалить то что в скобках и скобки тоже
Код
Here it is not necessary to remove[it should be removed]this is also not necessary to remove   
Here it is not necessary to remove[it should be removed]this is also not necessary to remove
Поиск файла по имени (LUA)
 
Подскажите пожалуйста!
Возможно ли скриптом lua найти файл на компьютере.
то есть:
Известно имя и расширение файла, но неизвестен путь,
возможно ли при помощи "LUA" как то просканировать диск "С" и получить путь этого файла ???
Вопросы по LUA
 
Цитата
Sergey Gorokhov написал:
какие кавычки? selT[1] не выводит никаких кавычек
Выводит,
Просто в таких случаях они не отображаются в консоле, но на самом деле они есть
вот скриншоты,через консоль проверяешь их(кавычек) нет,а в программе на самом деле есть
скриншот из программы:  
скриншот из консоли:  
скриншот из консоли нотепад++:  
Цитата
Sergey Gorokhov написал:
function toboolean(value)
Спасибо огромное
Вопросы по LUA
 
Еще вопрос:Подскажите как убрать ковычки.
Загоняем строку  selX  в таблицу


Код
selX = "&true&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false"
    selT = {}
    for S in string.gmatch (selX, "[^&]+") do
        if not tonumber(t)then t = 0 end t = t + 1 
        selT[t]=S
    end

на выходе получаем вот такую таблицу со строками
вопрос:как превратить строки в таблице в boolean (логический)
Код
selT.1      "true"
selT.2      "false"
selT.3      "false"
selT.4      "false"
selT.5      "false"
selT.6      "false"
selT.7      "false"
selT.8      "false"
selT.9      "false"
selT.10      "false"
selT.11      "false"
selT.12      "false"
selT.13      "false"
selT.14      "false"
selT.15      "false"
selT.16      "false"
selT.17      "false"
selT.18      "false"
selT.19      "false"
selT.20      "false"
selT.21      "false"
selT.22      "false"
selT.23      "false"
selT.24      "false"
selT.25      "false"
selT.26      "false"
selT.27      "false"
selT.28      "false"
selT.29      "false"
selT.30      "false"
selT.31      "false"
selT.32      "false"
selT.33      "false"

а надо вот так
Код
selT.1      true
selT.2      false
selT.3      false
selT.4      false
selT.5      false
selT.6      false
selT.7      false
selT.8      false
selT.9      false
Вопросы по LUA
 
Цитата
Игорь Б написал:
Последний AND - лишний.
Спасибо большое!
Что то я вообще туплю, тут и один SaveRest == 1 тоже лишний,Сейчас на свой вопрос посмотрел,аж самому смешно стало,а до этого что то сообразить не мог
Спасибо еще раз большое!
Вопросы по LUA
 
Привет Всем!
Скажите пожалуйста как правильно написать условие
Пишу разными условиями все работает,а если все в одном условии то выдает ошибку  "unexpected symbol near '='/неожиданный символ рядом с '='"
Что я неправильно делаю,как прописать одним условием?
Код
не работает
if SaveRest == 1 and SaveRest == 1 then  selT = {} and timT = {} end

работает
if SaveRest == 1 then selT = {} end
if SaveRest == 1 then timT = {} end

функции в функцию
 
Цитата
Suntor написал:
Ну так как вы написали, только скобки у ф-ций в аргументах уберите, и будет работать.

Так а что прописать в самой функции?
Код
function main(fun_1, fun_2)
    if something then
        fun_1()--вот здесь что прописать? если прописано fun_1() , то получим ошибку:   attempt to call a nil value (local 'fun_1')
    else
        --fun_2(????????) -- ну и здесь
    end
end
функции в функцию
 
Привет всем!
Скажите пожалуйста, возможно ли в lua как то организовать вот такое?
Есть у нас в коде много функций
Код
    function One()
        bla
    end
    ---
    function Two()
        bla
    end
    ---
    function Three()
        bla
    end
    ---
    function Four()
        bla
    end
    ---
    function Five()
        bla
    end
    ---
    function Six()
        bla
    end
    ---
    function Seven()
        bla
    end
    ---

далее есть основная функция, здесь я пример  очень коротко изобразил,но думаю смысл понятен,где стоят вопросы-туда надо вставлять определенные функции
И вот вопрос: возможно ли это реализовать как то с одной функцией
Код
    function main(fun_1(???),fun_2(???))
        if something then
            --fun_1(????????) 
        else
            --fun_2(????????)
        end
    end
 

 Что бы это выглядело примерно так  
Код
   
    if     bla_1 then
        main(One(),Two())
    elseif bla_2 then
        main(Three(),Four())
    elseif bla_3 then
        main(Five(),Four())
    elseif bla_4 then
        main(Six(),Seven())
    elseif bla_5 then
        main(Seven(),One())
    end


Думаю объяснил понятно
Как сократить условие if 'string' then print() end
 
vgi, Спасибо большое.
Как сократить условие if 'string' then print() end
 
Спасибо большое!
То что нужно.
Как сократить условие if 'string' then print() end
 
Всем привет!
Подскажите пожалуйста
Можно ли в lua как то сокращать условие

Например есть у нас такое условие
Пример:
Код
Name = 'Marina'
if Name == "Marina" or Name == "Lena" or Name == "Igor" or Name == "Sveta" or Name == "Dima" then
    print(Name)
end

А можно ли как то сократить, что бы это звучало примерно как то так
Пример:
Код
if Name == "Marina" or "Lena" or "Igor" or "Sveta" or "Dima" then
    print(Name)
end
function
 
Цитата
Suntor написал:
Ну а в параметры вынести эти самые значения что мешает?
функция достаточно большая и перечислять надо очень много проще функцию продублировать и знаки поменять

короче понятно что так делать нельзя
function
 
Цитата
Sergey Gorokhov написал:
Функция main должна быть только одна

Функция main: Это я так, для примера написал

Есть у меня Функция
function bla()
она находит и перемещяет  много предметов в перед ,то есть работает в плюс (функция достаточно большая)

далее в скрипте происходит кое что еще

И затем мне надо все переместить обратно,но не на тоже место , то есть эта же функция - только в минус
Страницы: 1 2 След.
Наверх