Средства разработки многопоточных скриптов в QUIK.

Страницы: Пред. 1 2 3 4 5 6 7 След.
RSS
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Артем, Вот, лапуль, ещё одна цитата из моей книги - для общего развития:

К сожалению, даже такой язык, как C несколько ограничен по функциональным возможностям: затруднена инициализация неоднородных массивов, отсутствует возможность создания меток в массивах или меток межпрограммного перехода (тривиальные задачи для любого языка ассемблера). Кроме того, стандарты ANSI, UNIX или K&R не поддерживают строчных комментариев, что крайне неудобно. Поэтому в SINT допускается использование модулей на языках ассемблера (по возможности, выполненных как вставки в текст на C и транслируемых компиляторами C/C++). Мы также активно используем строчные комментарии, поскольку все зарегистрированные на сегодняшний момент компиляторы их понимают. В крайнем случае, комментарии несложно удалить программно.

 
Владимир,  Lua работает с ошибками но такой же результат кода на С это другое. То С лучший язык то С++ на самом деле получше. С меня достаточно этого маразма. Жаль тут функции игнора нет, придётся силу воли задействовать.
 
Артем, Сила воли Вам не поможет - нужно ещё мозги иметь и знания.

НЕТ "такого же результата кода на С"! Уберите "int" из оператора цикла Вашего примера - тогда там будет С. Да, "С лучший язык", а С++ на самом деле говно. И держится на плаву лишь потому, что включает в себя продукт разработки двух гениев. Как и множество других языков - за счёт передранного оттуда же синтаксиса
 
Цитата
Владимир написал:
Артем , Сила воли Вам не поможет - нужно ещё мозги иметь и знания.
а тебе, дружок - адекватности не помешает занять где-либо

фигли ты тут за молодняком со своими драными писульками гоняешься?
ты осквернил unix-way и С  своими каракулями, презрел базовые принципы пустой гордыней

не примазывайся, ты не наш, скорее тутошный

язык С и без твоих комментов в порядке когда к месту
как и другие чуть более унылые инструменты в унылой реальности

а x86 тебя устраивает?
а вендоз?
а система образования и здравоохранения?
а культура ?

узбагойзя нервный пенс
тоже мне нашел причину пузыриться

общая деградация очевидна и будет только расти
каждый недоучка теперь комменты строчит и видосы ляпает
бесценные мнения источяют зловония повсюду
 
новичок, Адекватности у меня, дружок, выше крыши - с другими поделиться могу.  :smile: И кто тут "пузырится"? Очередной полуграмотный распальцованный неуч с растопыренными пальцами получил щелчок по носу и, надеюсь, наконец, заткнётся. А общая деградация уже состоялась - программисты ВЫМЕРЛИ!
 
Цитата
Артем написал:
TGB ,про бинарные строки вам уже рассказали. Собственно эта информация прямым текстом написана в третьем параграфе первой главы, т.е. в самом начале инструкции - которую вы очевидно не читали. Так что пожалуйста прочитайте, целиком и полностью. Перед тем как делать библиотеки для других людей, сначала убедитесь что ваши познания и умения находятся на уровне повыше плинтуса.
 После этого комментария, когда у меня появилось время, мне (сразу, без переобувания в тапочки :smile: ) захотелось поучиться у вас, и посмотреть тот код, который вы тут выложили.
  Выложенный вами модуль, в целом, написан в хорошем стиле. Если вы это сделали сами, то, похоже на то, что Lua вы знаете. Однако, несколько настораживает то, что в модуле нет ни одного комментария и много операторов одной строкой. Такое ощущение, что это написано сразу начисто (и без отладки). Я бы так не смог :smile: .
  При более детальном просмотре я увидел, что в представленном вами модуле есть ошибки (я сделал правки в 8-ми местах). Чего я не ожидал  :smile:  так это то, что в нем не учтено существование в Lua типа boolean (смотрите правки в коде модуля). Этот тип хорошо описан в любезно предложенной вами инструкции на сайте https://www.lua.org/manual/5.3/  в разделе 2.1  (в 1.3 этого описания не ищите).
  Я поправил в модуле те ошибки, которые, как мне кажется, увидел (но возможно и добавил свои :smile: ). Понятно, что какие-то ошибки могли и остаться. Свои правки я как-то прокомментировал, выделив существенные изменения символами ###.  
  Модифицированный код модуля выложен в конце данного комментария.
  Кстати, я проверил быстродействие dumpstr модуля  на своем ПК и моем _G  (понятно, что у нас с вами в этом могут быть большие различия). Мой dump_str  (написанный два года назад, в тренировочных целях, когда мне пришлось перейти на  QUIK) выполняется (на таблице _G)  в 3 раза быстрее, чем dumpstr модуля, но это мелочи. У представленного вами модуля назначение другое (в том виде как он есть, это точно не визуализация) и его функциональность богаче.
----
    То, что делается в исходном, обсуждаемом модуле, можно сделать, как мне кажется, элегантнее, формируя в качестве строки образа таблицы, текст исполняемого скрипта. Результат такого подхода:
1) tbl_to_str на ~20% - длиннее, чем dumpstr;
2) str_to_tbl  - короче аналогичной  loadstr в ~10 раз. .
--------------------------------
P.S.
 Все мы, время от времени, в чем-то ошибаемся. Существенная разница состоит только в том, что одни больше усилий предпринимают для устранения своих ошибок, а другие на их оправдание и надувание щёк.
-------
Измененный код обсуждаемого модуля:
Код

local aliases = { }     

local function escape ( s )
    s = tostring ( s ):gsub ( "\n", "\\n" )
    return s
end

 local function dumpstr ( t, alias, seen )
    alias, seen = alias or aliases, seen or { }
    if seen[ t ]  then return "" else seen[ t ] = true end
    local s, mt = string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ), getmetatable ( t )
    if mt then s = string.format ( "%smetatable %s\n", s, alias [ mt ] or escape ( mt ) ) end
 local k_t, v_t                                                                                                                     
    for k, v in pairs ( t ) do
       k_t, v_t  = alias[ k ] or escape ( k ),  alias[ v ] or escape ( v )                                         
      if k_t == 'charpattern' then v_t = '%[' end                                    ----     ??? --- и без этого все работает, но если этот символ оставить в покое, обрубается виализация результата dumpstr ?
        s = string.format ( "%sk %s %s\nv %s %s\n", s, type ( k ), k_t, type ( v ), v_t )                
    end
    if mt  then  s = string.format ( "%s%s", s, dumpstr ( mt, alias, seen ) )  end
    for k, v in pairs ( t ) do
        if type ( k ) == 'table'  then s = string.format ( "%s%s", s, dumpstr ( k, alias, seen ) ) end
        if type ( v ) == 'table' then s = string.format ( "%s%s", s, dumpstr ( v, alias, seen ) ) end
    end 
    return s
end

local function unescape ( s )
    s = s:gsub ( "\\n", "\n" )
    return s
end
---------------                                                         ! Символами ###  выделены измененные места, для  исправления ошибок    -------
local function loadstr ( s, alias )
    alias = alias or aliases
    do local t = { } for k, v in pairs ( alias ) do t[ v ] = k end alias = t end
    local tlist, tcurr, kcurr, troot = { }, nil, nil, nil
   local tmt, ttb 
    for l in s:gmatch ( "([^\n]+)\n" ) do
        local nt = l:match ( "newtable (.+)" )
        local mt = l:match ( "metatable (.+)" )
        local kt, k = l:match ( "k ([^ ]+) (.+)" )
        local vt, v = l:match ( "v ([^ ]+) (.+)" )
        if nt     then    if tmt then setmetatable ( ttb, tmt ); tmt, ttb  = nil, nil  end                      --- ###   1. setmetatable выполняется после завершения формирования  ttb (смотрите п.2)
            tlist[ nt ] = tlist [ nt ] or alias[ nt ] or { }; tcurr = tlist[ nt ]; troot = troot or tcurr;  d_nt = nt 
        elseif mt then tlist[ mt ] = tlist[ mt ] or alias [ mt ] or { };  ttb = tcurr; tmt = tlist [ mt ]        --  ###  2. setmetatable  нужно выполнять после того как будет полностью сформирована tcurr. 
        elseif k then                                                                                                             ----         Иначе могут срабатывать метаметоды, если метатаблица была сформирована раньше. 
            if   kt == 'table' then  tlist[ k ] = tlist[ k ] or alias[ k ] or { }; kcurr = tlist[ k ]
            elseif kt == 'number' then kcurr = alias[ k ] or tonumber ( k ) or 0/0
            elseif kt == 'string' then kcurr = alias[ k ] or unescape ( k )
         elseif kt == 'boolean'  then  kcurr = alias[ k ] or  k                                                 ----- ###   3.  добавлено (учет типа boolean): elseif  kt == 'boolean'  then  kcurr = alias[ k ] or  k  ---
            else kcurr = alias[ k ]  or  k                                                                                 ----- ###   4.   добавлено (учет:элеметов не входящих в alias)   or  k   ---
            end
        elseif v and tcurr and kcurr ~= nil then
            if   vt == 'table' then tlist[ v ] = tlist[ v ] or alias[ v ] or { }; tcurr[ kcurr ] = tlist[ v ]
            elseif vt == 'number' then  tcurr[ kcurr ] = alias[ v ] or tonumber ( v ) or 0/0           
            elseif vt == 'string' then tcurr[ kcurr ] = alias[ v ] or unescape ( v )
         elseif vt == 'boolean' then  tcurr [ kcurr ] = alias[ v ] or  v                                        ---- ###   5.   добавлено: elseif vt == 'boolean' then  tcurr [ kcurr ] = alias[ v ] or  v ---
            else tcurr [ kcurr ] = alias[ v ] or  v                                                                       ----- ###   6.   добавлено:  or  v   ---                
            end
        end
    end
   if tmt then setmetatable ( ttb, tmt )   end                                                                         --- ###   7. Выполняется в поледней обработанной таблице (! если у нее есть метатаблица)
    return troot
end

local function dumpfile ( file, t, alias, seen )
    alias, seen = alias or aliases, seen or { }
    if seen[ t ] then return else seen[ t ] = true end
    local mt = getmetatable ( t )
    file:write ( string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ) )  
    if mt then file:write ( string.format ( "metatable %s\n", alias [ mt ] or escape ( mt ) ) ) end
    for k, v in pairs ( t ) do
        file:write ( string.format ( "k %s %s\nv %s %s\n", type ( k ), alias[ k ] or escape ( k ), type ( v ), alias[ v ] or escape ( v ) ) )
    end
    if mt then dumpfile ( file, mt, alias, seen ) end
    for k, v in pairs ( t ) do
        if type ( k ) == 'table' then dumpfile ( file, k, alias, seen ) end
        if type ( v ) == 'table' then dumpfile ( file, v, alias, seen) end
    end
end

local function addalias ( item, path, deep, seen )
    if item == nil and path == nil and deep == nil and seen == nil then item, path, deep = _G, "_G", true end
    seen = seen or { }
    if item == nil or path == nil or seen[ item ] ~= nil then
        return
    elseif type ( item ) == 'table' and deep then
        seen[ item ] = true
        for k, v in pairs ( item ) do
            if type ( v ) == 'table'  then
                addalias ( v, string.format ( "%s.%s", path , escape( k ) ), deep, seen )   
            elseif type ( v ) ~= 'string' and type ( v ) ~= 'number' and type ( v ) ~= 'boolean' then         ----- ###  8.   добавлено (учет boolean):  and type ( v ) ~= 'boolean' 
                aliases[ v ] = string.format ( "%s.%s", path, escape ( k ) )  
            end
        end
    else
        aliases[ item ] = path
    end
end
 
addalias ( math.huge, "math.huge" )
addalias ( -math.huge, "-math.huge" )

return { dumpstr = dumpstr, dumpfile = dumpfile, loadstr = loadstr, addalias = addalias }
 
TGB, не знаю в чём у вас проблема с charpattern:
Код
local s = dumpstr ( { charpattern = utf8.charpattern } )
local t = loadstr ( s )
print ( t.charpattern == utf8.charpattern )
> true
for i = 1, math.max ( string.length ( t.charpattern ), string.length ( utf8.charpattern ) ) do
  print ( string.byte ( t.charpattern, i ), string.byte ( utf8.charpattern, i ) )
end
> 91 91 / 0 0 / 45 45 / 127 127 / 194 149 ...
Может в терминале вывод тестировали и он на нулевых байтах обрывал вывод?

С метатейблами тоже мне не понятно в чём затруднение - тут и так сначала заполняется исходная таблица а потом её содержимое влючая метатаблицу, просто за счёт того в каком порядке данные сбрасываются: никакой дополнительной программной обработки не требуется. Метаметоды конечно должны быть в таблице алиасов - программный код не может быть сброшен и загружен. При желании можно с байткодом конечно шаманить но с функциями на С это всё равно не работает, так что ради единообразности и Lua функции тоже не поддерживаются.

С булевыми значениями действительно просчёт, но решается он так же как с математическими константами: добавлением алиасов.
Код
addalias ( math.huge, "math.huge" )
addalias ( -math.huge, "-math.huge" )
addalias ( true, "true" )
addalias ( false, "false" )
 
TGB, у вас тут кстати ошибка:
Код
elseif kt == 'boolean' then kcurr = alias[ k ] or k        
elseif vt == 'boolean' then tcurr [ kcurr ] = alias[ v ] or v
переменные k и v здесь строкового типа со значениями "true" или "false" текстом, таблицы с булевыми значениями загрузятся неправильно.

С алиасингом булевых значений в глубоких таблицах действительно была ошибка которую надо исправить, хотя в целом некритичная - булы они и в африке булы, под каким именно алиасом они сидели это неважно.
 
Я понял в чём проблема с метатаблицами: возможны ситуации, когда метатаблица загружается до того, как исползующий ей стол, тогда метаметоды будут активны сразу. Метаметоды можно обойти через rawset.
Код
if     vt == 'table' then tlist[ v ] = tlist[ v ] or alias[ v ] or { }; v = tlist[ v ]
elseif vt == 'number' then v = alias[ v ] or tonumber ( v ) or 0/0
elseif vt == 'string' then v = alias[ v ] or unescape ( v )
else v = alias[ v ]
end
rawset ( tcurr, kcurr, v )
Не уверен стоит ли добавлять строку для обработки булевых значений явно вместо простого добавления алиасов. Это освободит имена "true" и "false" но их по-хорошему нельзя ни для чего другого использовать в любом случае. Плюс сериалайзеры всё равно смотрят в таблицу алиасов первым шагом. Для читабельности кода разве что?
Код
elseif kt == 'boolean' then kcurr = alias[ k ] or k == 'true'
elseif kv == 'boolean' then v = alias[ v ] or v == 'true'
 
Цитата
Артем написал:
elseif kt == 'boolean' then kcurr = alias[ k ] or k == 'true'
elseif kv == 'boolean' then v = alias[ v ] or v == 'true'
  С этим согласен.
Цитата
Артем написал:
Я понял в чём проблема с метатаблицами: возможны ситуации, когда метатаблица загружается до того, как исползующий ей стол, тогда метаметоды будут активны сразу. [QUOTE]
 Именно о такой ситуации я написал в комментарии кода.
[QUOTE]Артем написал:
Метаметоды можно обойти через rawset.
Тоже нормальный (и более простой) вариант.
Цитата
Артем написал:
При желании можно с байткодом конечно шаманить но с функциями на С это всё равно не работает, так что ради единообразности и Lua функции тоже не поддерживаются.
Это я не понял.
 
TGB, в Lua имеется встроенный компилятор который производит бинарный байткод, который может выполняться в виртуальной машине Lua. В него можно отправлять целые файлы или отдельные фукнции. Байткод потом можно загрузить в виде исполняемого кода. Никаких преимуществ по сравнению с использованием обычных текстовых исходников не даёт - Lua и так перед началом работы внутренне производит этот байткод и его потом исполняет.


Так что технически есть возможность сбрасывать и загружать чистые Lua-функици. Но поскольку нужно будет еще и сбрасывать C-функции, что невозможно, то лучше и Lua-функции не поддерживать. Перед вызовом сериализаторов просто затолкайте нужные функции в таблицу алиасов, и они подцепятся. Классы кстати тоже туда нужно заталкивать, иначе при загрузке будут воспроизводиться копии объектов-классов а не использоваться созданные в программе.
 
По поводу метаметодов еще. Метаметод __pairs может препятсвовать правильной выгрузке, так что "pairs ( t )" надо заменить на "next, t". Метаметод __metatable может скрывать истиную метатаблицу так что getmetatable and setmetatable надо заменить на debug.getmetatable и debug.setmetatable.


Также rawset не принимает невалидные ключи, так что надо добавить барьер.
Код
if kcurr ~= nil and kcurr == kcurr then rawset ( tcurr, kcurr, v ) end
 
Цитата
Артем написал:
TGB , в Lua имеется встроенный компилятор который производит бинарный байткод, который может выполняться в виртуальной машине Lua.
и т.д  ..........
 Это мне известно.

Похоже, мы обсуждаем:
Цитата
TGB написал:
То, что делается в исходном, обсуждаемом модуле, можно сделать, как мне кажется, элегантнее, формируя в качестве строки образа таблицы, текст исполняемого скрипта. Результат такого подхода:
1) tbl_to_str на ~20% - длиннее, чем dumpstr;
2) str_to_tbl  - короче аналогичной  loadstr в ~10 раз. .
   Здесь рассмотрен вариант когда результатом выполнения функции tbl_to_str (аналога dumpstr) является строка-скрипт вида:
local TBL = {}  
TBL.table00000263878C31B0 =  {}  --- создание таблицы --
TBL.table00000263878C31B0 [ [[expansion]] ] = [[txt]]
TBL.table00000263878C31B0 [ [[INTERVAL_W1]] ] = 10080
TBL.table00000263878C31B0 [ [[QTABLE_DOUBLE_TYPE]] ] = 2
TBL.table00000263878C31B0 [ [[INTERVAL_M5]] ] = 5
---- и так далее.
return TBL.table00000263878C31B0
-------
Функцию str_to_tbl я приведу полностью:
--- Рузультат функции: таблица полученная из строки s или текст описания ошибки ---
local function str_to_tbl (s )
   do local tt= { }     for k, v in pairs ( alias ) do tt[ v ] = k end alias = tt end --- alias: переворот: alias = { [ <Имя> ] = <Значение (> }
   local fun , err = load ( s )  
   if  err ~= nil  then return  err  else   return  fun()   end
end
--------------------
 
Цитата
Артем написал:
С алиасингом булевых значений в глубоких таблицах действительно была ошибка которую надо исправить, хотя в целом некритичная - булы они и в африке булы, под каким именно алиасом они сидели это неважно.
   Я еще раз посмотрел addalias ( item, path, deep, seen ) и не увидел контроля уникальности path (с выдачей сообщения об ошибке в каком-то виде). Делать это надо отдельно  от уже реализованного контроля уникальности item.
 
TGB, я ассерт на копии значений поставил в функцию инвертирования таблицы, но не упомянул. Так как нужно это только для дебага ручных операций, то не стал заморачиваться с такими вещами как вторичная инвертированная таблица для проверки уникальности по месту.

Генерировать сериализированные файлы в формате исполняемого кода это что называется все фломастеры на вкус разные. Вывод всё равно получается кашеобразный и нечитаемый.
 
Цитата
Артем написал:
TGB , я ассерт на копии значений поставил в функцию инвертирования таблицы, но не упомянул. Так как нужно это только для дебага ручных операций, то не стал заморачиваться с такими вещами как вторичная инвертированная таблица для проверки уникальности по месту.
Есть хорошо известный принцип любой разработки (и не только программ): контроль должен выполняться в том месте, в котором используются данные, а не известно где. Это делается хотя бы потому, никто не знает требований к данным. лучше чем потребитель.
-----
Цитата
Артем написал:
Генерировать сериализированные файлы в формате исполняемого кода это что называется все фломастеры на вкус разные. Вывод всё равно получается кашеобразный и нечитаемый.
 Зря вы это написали, вынудив меня ответить. Я нигде не утверждал, что предложенный мною вариант реализации обсуждаемого модуля нацелен на виализацию таблиц. Хотя, мне кажется, что вы понимаете, что нет проблем добавить в этот вариант отступы вложенности и комментарии и это сильно повысит качество виализации. Но опять же, я не про это.
Я про другое:
Цитата
TGB написал:
2) str_to_tbl  - короче аналогичной  loadstr в ~10 раз. .
На самом деле, как я вас понимаю, но возможно ошибочно, ваша квалификация позволяет вам быстро достаточно реально оценивать программы (напмсанные, во всяком случае, на Lua).
Здесь же. похоже, имеет фактор, отмеченный в моем филосовском отступлении:
Цитата
TGB написал:
P.S.  Все мы, время от времени, в чем-то ошибаемся. Существенная разница состоит только в том, что одни больше усилий предпринимают для устранения своих ошибок, а другие на их оправдание и надувание щёк.
:
 
Цитата
TGB написал:
Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.
 В этом я ошибся.
 
Цитата
Артем написал:
 Lua использует бинарные строки с указанной длиной. Указанные строки - разные, и Lua будет их считать разными; при выгрузке в файл значения разные (и совпадающие со входящими). То что они отобразились одинаково это вероятно из-за того, что в используемом терминале используется С стандарт строк с нуль-терминатором.
 Замечание верное, действительно, в своем выводе в файлы и на экран я придерживался стандарта С и с учетом того, что стандарт Lua другой это моя ошибка.
 
TGB, Ошибка, как всегда, в терминологии. Я, по-моему, впервые в жизни увидел термин "бинарные строки" именно на этом форуме, а уж "бинарные строки с указанной длиной" - это вообще БСК. Это как Шеннон назвал свою теорию передачи данных "теорией информации" - и началось... Массив от строки отличается столь же радикально, как и данные от информации: строка есть кусок памяти, размер которой не известен и определяется по заранее специфицированному значению терминатора (не обязательно байтового и, тем более, нулевого). Размер же массива всегда известен заранее, и потому никаких терминаторов не требуется. А потому Вы не ошиблись: если нулевой байт считается терминатором, то "a" и "a\0b" И В САМОМ ДЕЛЕ "эквивалентные строки" (но разные массивы данных).
Как я когда-то писал:
Кроме атомарных, существуют также элементы данных, представляющие собой группы полей, называемые разными авторами «сегментами», «наборами» и другими терминами. Существует два типа групп однородных элементов: массив (множество элементов заданного размера) и строка (размер этой группы определяется по заранее установленному значению терминатора). Группы же разнородных элементов фактически отличаются друг от друга лишь названием: узел (графовая модель), кортеж (реляционная модель), класс (объектный подход), структура (языки программирования). Так, понятие class отличается от struct разве что возможностью заполнять поля структуры конкретными значениями при её описании (за это «в нагрузку» получаем конструкторы с деструкторами).
 
Цитата
Владимир написал:
если нулевой байт считается терминатором, то "a" и "a\0b" И В САМОМ ДЕЛЕ "эквивалентные строки" (но разные массивы данных).
   В  в строке Lua нулевой байт не считается терминатором. Если мы что то разрабатываем в Lua, то приходится учитывать среду разработки, даже если она нам не нравится.
 
TGB, А ХОТЬ КАКОЙ-НИБУДЬ - считается? Если нет, то это не строка, а именно массив. Если мы не знаем размер этого массива, то для нас это всё равно строка. Я, кстати, отношусь к переменным Lua именно как к строкам с нулевым байтом в качестве терминатора. :smile: Я точно знаю (и использую), что в строках этих могут встречаться байты \1, \2, \3, \4, но вот нулевой байт, а также символы 13 и 10 не использую. Так, на всякий случай.
 
Цитата
Владимир написал:
TGB, А ХОТЬ КАКОЙ-НИБУДЬ - считается? Если нет, то это не строка, а именно массив.
Тут действительно вопрос семанткии: в классических языках программирования различие между строкой и массивом основано на содержимом - произвольные данные или валидный текст - причём строки это подмножество массивов в любом случае. Так что спорить что ABC это строка а XYZ это массив это онанизм. В языке Lua строки определены как иммутабельные уникальные объекты абстрактного характера для которых существуют функции работы с ASCII-текстом, а массивов в Lua вообще не предусмотрено, так что тут спорить что ABC это строка а XYZ это массив это не только онанизм но еще и тупость т.к. про всё это прямо в документации написано.
 
Артем, Так документация-то глупая! Язык паршивый, и документация соответствующая. По ней в языке вообще ничего нет, кроме строк.

Я не знаю, что там за "классические языки программирования", но различие между строкой и массивом алгоритмическое, и не "основано на содержимом". В языке как-то определены операции именно со строками, при этом lines читает строки из файла именно как строки, причём терминатором там 13+10 (или, может, просто 10), sub вырезает кусок строки как из массива - там нет места для терминатора, каким бы он ни был, find ищет подстроку вообще непонятно как - ни размера, ни терминатора там не определено. В результате полная каша. Но если вообразить, что это именно строки, и терминатор у них именно нулевой байт, то вся эта кухня худо-бедно работает. И строки - это НЕ "подмножество массивов в любом случае" - возможны строки, составленные из нескольких массивов, возможны строки строк, строки структур, строки объектов. И нетекстовые символы в Lua прекрасно уживаются, и "иммутабельность" вместе с "валидностью текста" им по барабану, какая бы чушь ни была написана в этой долбаной "документации".
 
Цитата
Владимир написал:
строка есть кусок памяти, размер которой не известен и определяется по заранее специфицированному значению терминатора

Такое может существовать только в голове дурачка с крайне ограниченными познаниями.
 
swerg, Такое, милок, существует "независимо от воли и сознания", как медицинский факт.  :wink:  
 
Да, ты медицинский факт, это и так уже всем понятно.
 
Поддерка, вы спам от КатСервиса уберёте уже из этой темы?!!
Особенно смешно (если не сказать грустно) долгое наличие этого сообщения выглядит после совершенно бестолкового наезда на одного из грамотных пользователей форума за "рекламу" в сообщениях.
 
swerg, Ну хватит тяфтяфкать, милок! За слова свои отвечать квалификации не хватает - понимаю, но тогда уж приличнее помолчать. :wink:  
 
Цитата
Владимир написал:
swerg, Ну хватит тяфтяфкать, милок! За слова свои отвечать квалификации не хватает - понимаю, но тогда уж приличнее помолчать

Программирование давно и далеко ушло от Фортрана на БЭСМ-6. И даже от Кернигана с Ричи.

Самое простое, что  можно сделать для расширения кругозора, это обратиться к Википедии. Окажется, что существует несколько разных способов организации строкового типа. Я даже ссылку вам дам на русском языке: Строковый тип

P.S. Про ваше героическое прошлое мне известно, про удивительный скрипт тоже. Убедительная просьба больше не хамить, всему есть предел.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
s_mike@rambler.ru, Так не несите ахинею, плиз! Про пустую ТТТ больше не вякаем? И про строковый тип не советую - я на этом собаку съел. И не одну.

Ну и нафига Вы дали ссылку на Вики? Там хоть полслова сказано в опровержение того, что говорил я? Ну, ловите "в отместку" парочку цитат из моей книги:

Общие метаданные физического слоя, вроде очереди событий, помещены в БД как субграф с прописанной в паспорте БД точкой входа для доступа к ним. Поскольку семантический смысл полей данных на этом уровне значения не имеет (важен лишь физический адрес полей и их размер), здесь необходимо лишь минимальное количество типов данных: BYTE, WORD, DWORD, QWORD (т.е. поля размером 1, 2, 4 и 8 байт соответственно) и два типа групп: ARRAY (массив полей одного из вышеуказанных типов) и STRING (массив полей, оканчивающийся терминатором).

Ещё одно возможное определение множества (SET) показано в классе Сотрудник: неатомарные атрибуты Договор {43.4} и Телефон {43.5} хранятся не как массивы {12.2}, а как строки {45.3}-{45.4}. Таким образом, мы можем иметь в БД произвольное число договоров и телефонов на одного сотрудника. Важный нюанс состоит в том, что сотрудник {46} имеет два договора {46.3}, а один из этих договоров {51} имеет сразу три исполнителя (т.е. реализовано отношение «многие-ко-многим»), и даже разных классов {51.2}: одна Компания, и двое Сотрудников.

Ах, да - и у меня прямо противоположное мнение на тему, кто именно хамит. :wink:  
 
Цитата
Программирование давно и далеко ушло от Фортрана на БЭСМ-6. И даже от Кернигана с Ричи.
....Убедительная просьба

s_mike@rambler.ru, вы всерьез пытаетесь разговаривать с говном как с человеком??
Удивительные люди :)
 
swerg,Чо, лапуль, аж в истерике бьёмся? Это можно, только вот корчить из себя крутого программера в моём присутствии - это уже чревато. :smile:  
 
Цитата
Владимир написал:
Артем, Так документация-то глупая! Язык паршивый, и документация соответствующая.
Язык отличный и документация исчерпывающая - всё верно. Кому-то не нравятся 1-индексируемые таблицы, кому-то отвратительны begin-end вместо скобок, кто-то жалуется на отсутствие += и ++, кому-то свербит от того что - как в С - классов не предусмотрено и если очень хочется то надо свою реализацию делать. Но того факта что это, можно смело сказать, самый лучший встраиваемый скриптовый язык - не отменяет. Можно даже спорить что Lua это вообще самый лучший скриптовый язык, лучше даже чем Python (т.к. выигрывает он главным образом в размере экосистемы).


Строки в Lua это "непрозрачные" (opaque) объекты для которых определены строковые функции и тип "string". Внутренне каждый раз когда создаётся строка, проводится проверка существует ли уже эта строка, и в таком случае память не выделяется а просто выдается указатель на существующую строку. Указатель потом трансформируется в Lua-объект. В результате чего кстати сравнение строк такое же быстрое как сравнение чисел, хотя это больше для LuaJIT релевантно т.к. оверхед у него ниже. По этой технической причине, изменять строки нельзя, можно только создавать новые, хотя тут конечно "курица или яйцо" - может решили так сделать потому что строки иммутабельные, а может объявили строки иммутабельными потому что так сделали. Сами строки внутренне обрабатываются как набор байтов фиксированной длины а не как текст, что упрощает/ускоряет обработку под капотом и развязывает руки программистам, при этом ни на что не влияя если собственно обрабатывать как текст.

Чтобы можно было строки индексировать как таблицы, можно сделать вот такой финт ушами:
Код
do
    local smt = getmetatable ( "" )
    local __index = smt.__index
    smt.__index = function ( s, k )
        if type ( k ) == 'number' then
            return s:sub ( k, k )
        else
            return __index[ k ]
        end
    end
    smt.__len = function ( s ) 
        return s:len ( )
    end
end
Код
local s = "foo bar"for i = 1, #s do print ( i, s[ i ] ) end
 
Артем, Какие "индексируемые таблицы" - побойтесь Бога! Мне чуть ли не с первого дня стало очевидно, что тут постоянно путают индексы и имена, что является источником многочисленных глюков - в том числе, и в основном ПО Квика (таблица заявок, я об этом не раз писал). Язык отвратителен, и только за убийство типа integer и замену его на вонючий "тип number" создателей нельзя подпускать к компу ближе, чем на километр - об этом и о многом другом я тоже писал. Как и о том, что синтаксис, про который Вы здесь соловьём заливаетесь, вообще не имеет значения - профессионалу всё равно, на каком языке писать, была бы обеспечена требуемая функциональность. О "качестве" языка говорит хотя бы то, что я, возможно, единственный на этом форуме, кто пишет на чистом Lua, и это включая лично Вас! Какие ещё нужны доказательства?

Господи, какая разница, как устроен сам Lua - тыщу раз говорил, что мы не разработчики языка, а пользователи, и потому нам ПО БАРАБАНУ его внутренности, включая эту долбаную "иммутабельность" - у меня лично все переменные, включая строки, вполне себе "мутабельные": s=s..s1..s2 - и пошли все на! И весь этот долбаный "оверхед" тоже по барабану! Мало того, что это интерпретатор, так у меня он ещё и почти всё время спит!

Для справки: все эти "далеко ушедшие вперёд" неучи, которыми написана заметка в Вики, на которую здесь давалась ссылка, всё-таки в курсе, что элементы строки не обязательно байты, но, судя по всему, ВААПЩЕ без понятия, что строки могут быть НЕ ТОЛЬКО текстом, что это именно АЛГОРИТМИЧЕСКОЕ понятие (и пофиг какая у них конкретная реализация): строки событий или, скажем, мультиязычные строки для них тайна за семью печатями. Или что тривиальная буферизация файловых операций даже при работе с текстовыми файлами читает и пишет, с точки зрения прикладника, именно строками, а обмен с диском при этом происходит массивами (секторами или там кластерами).

Строки НЕЛЬЗЯ "индексировать как таблицы", какие бы не делать "финты ушами": индекс - это НЕ имя, и об этом я тоже писал буквально в первых же своих постах (а Ваш убогий "финт ушами" эмулирует обращение по индексу как массива, а не "как таблицы", и абсолютно бесполезен - разве что для пущего оверхеда). У меня все элементы моих таблиц именуются, типа, индексами, так что в коде полно конструкций вида:
for k=j+1,a[i][12][0][0] do if a[i][12][j][0]==a[i][12][k][0] then...
но ежу понятно, что никаких индексов нет, не было и не будет. Ещё 29.09.2020 10:31:16 я писал:
Ну вот, по Вашей ссылке, первым же предложением: "Tables in Lua are not a data structure; they are the data structure. All structures that other languages offer---arrays, records, lists, queues, sets---are represented with tables in Lua". Иными словами, никаких структур данных просто НЕТ! Печально... А уж "обоснование" и вообще курам на смех: "Хотя мы МОЖЕМ (!) реализовать массивы и списки, таблицы мощнее. Многие алгоритмы упрощаются до тривиальности с использованием таблиц". И дальше вообще издевательство: "Например, вы редко пишете поиск в Lua, потому что таблицы предлагают прямой (!!!) доступ к любому типу". Ребятки, доступ по ключу - это не прямой, а как раз КРИВОЙ доступ к данным! Даже если обозвать ключи "индексами". Уши бы надрать этому "Роберто Иерусалимскому!
 
Родина дала ему хеш-таблицы с оптимизацией для целочисленных индексов - нет не хочу, хочу жрать гомно. Ну что поделаешь если в голове тараканы вместо нервных клеток.
 
Артем, Нахера мне нужны хеш-таблицы, да ещё, прости, Господи, "с оптимизацией"? Мне нужны целочисленные ПЕРЕМЕННЫЕ! И индексы тоже 7не помешают, которых в языке тупо НЕТ. :wink:  
 
Владимир, IEEE 64-битные флоаты поддерживают целочисленные операции до 53 бит. В языке версии 5.3 добавили 64-битные целочисленные структуры и операторы вывод которых только целочисленный.
 
Артем, Вот именно! Тоже давным-давно писал, что эта долбаная "проблема" с 19-значными номерами заявок и сделок высосана из пальца, ибо в UI64 спокойно влезают ВСЕ 19-значные числа и даже часть 20-значных!

Лично мне уже всё по барабану - мой скрипт работает даже в этих "антисанитарных" условиях. Единственное пожелание: оставьте язык в покое: того, что есть - ДОСТАТОЧНО для организации автоматической торговли в Квике!
 
Такие вещи как бы должны быть либо строковые либо BIGINT. Я может слепой но я не вижу причин по которым для клиента эти данные должны быть числовые а не строковые.
 
Артем, Никто никому ничего не "должен" - дайте юзеру возможность САМОМУ определять тип данных - и все дела! Добрая половина проблем тут же снимется.
 
Цитата
Владимир написал:
дайте юзеру возможность САМОМУ определять тип данных
Это в Lua есть.

Цитата
Владимир написал:
Добрая половина проблем тут же снимется.
Только не в вашем случае.
Ещё Крылов написал басню, про таких:

Код
К несчастью, то ж бывает у людей:
Как ни полезна вещь, — цены не зная ей,
Невежда про нее свой толк все к худу клонит;
А ежели невежда познатней,
Так он ее еще и гонит.
 
Незнайка, Нет этого в Lua. Нет, не было и не будет.

В моём случае как раз сняты все 146% проблем! :wink: Так что "такие" пишут РАБОЧИЕ скрипты, а вот "не такие" постоянно скулят про свои проблемы.
 
Что то на форуме много взаимных оскорблений. Зачем? Кому это нужно?  Это, в том числе, наносит и имиджевый ущерб разработчику QUIK.
  Градус общения на любом форуме определяются не пользователями (они бывают очень разные) а хозяином форума.
  Если бы я был директором  :smile: , то выдал бы следующие указания: добавить пользователям форума в их профиль закрытые по записи два раздела: предупреждения и благодарности. Кроме того, ввести лимит количества символов, вводимых пользователем в течении месяца, исключив из него коды программ.
  В правила форума добавить пункт, определяющий основания для блокировки (на  какой то срок), а также автоматическое удаления учетной записи пользователя на основании данных раздела предупреждения. Установить для предупреждений годовой срок давности, после которого они автоматически снимаются.
---------
  Удалять учетную запись пользователя без некоторой формализации, наверное, было бы вольюнтаризмом  :smile: .
 
TGB, Это путь в тупик. Я в Инете с 1992 года, и я ещё помню времена, когда никаких модераторов вообще не было. Качество дискуссий при этом было на порядок выше и обеспечивалось самими участниками. А угроблено это качество было в начале "нулевых", и угроблено именно модераторами.

Как-то раз на "Хоботе" (кстати, там были вообще лучшие правила ведения дискуссий, которые я когда-либо видел) сцепились мы с одним программистом из Вильнюса. Всерьёз сцепились, по принципиальным вопросам - только пух и перья летели! И вдруг какая-то шавка влезла в разговор и затявкала на меня "с его стороны". Максим раньше меня увидел этот пост и так на неё рыкнул,  что больше я того ника вообще не видел! Увы, и этот форум был угроблен, и тоже модераторами, и теперь там тихо, как в могиле. А раньше там были ежедневные драки, дискуссии моги длиться месяцами, а число участников исчислялось десятками. С некоторыми мы не раз встречались в реале, и "морды друг другу били" уже за кружкой пива. Кое с кем мы друзья до сих пор! Ну и, наконец, оскорбить невозможно даже теоретически - можно лишь оскорбитьСЯ.
 
Цитата
Владимир написал:
TGB , Это путь в тупик. Я в Инете с 1992 года, и я ещё помню времена, когда никаких модераторов вообще не было. Качество дискуссий при этом было на порядок выше и обеспечивалось самими участниками. А угроблено это качество было в начале "нулевых", и угроблено именно модераторами.
  Ну вы анархист и романтик :smile: .  Жизнь меняется и уже у собак появились аккаунты. Конечно, какой-то простор для творчества необходим, и если вы заметили, то для пользователей форума мною в моих указаниях это оставляется :smile:. Но когда, для того чтобы прочесть на форуме что-то не тривиальное, приходится пробиваться через сугробы напечатанного это не комильфо.
 
TGB, А я ещё тогда предлагал наделять хозяина ветки правами её модератора - это снимает почти все вопросы. Реализовано это было много позже, на Фейсбуке, но не как замену модераторам, а как дополнение к ним. Результат - налицо: ФБ тоже фактически угроблен!
 
Владимир, проблема не в том как Вы пишите, а в том что пишите. Я в сети тоже с 94 года. Всегда были разговоры по существу или общий балаган. Выражайте свое мнение, на здоровье. Но не надо его навязывать. Для простых разговоров есть другие форумы.
Вы пишите какое-то решение для себя. Но есть другие люди, которые имеют свое мнение на то, что им надо. Не про то как это написать, а именно что надо.
Вам не надо, другим надо. Они просят, значит надо сделать. Поэтому и возникаю проблемы при решении таких задач. Просто Вы с ними пока еще не столкнулись. Но это не значит, что их нет.
 
Цитата
Владимир написал:
TGB , А я ещё тогда предлагал наделять хозяина ветки правами её модератора - это снимает почти все вопросы. Реализовано это было много позже, на Фейсбуке, но не как замену модераторам, а как дополнение к ним. Результат - налицо: ФБ тоже фактически угроблен!
  А вот это совершенно лишнее. Называется это перегибы на местах :smile: .
 
TGB, Почему "лишнее"? Почему "перегибы"? Автор ветки как никто заинтересован в её качестве, а также в притоке туда других участников! Ему и вожжи в руки! Бразды правления, в смысле. Он и будет убирать флуд и поощрять предметные дискуссии. А если не будет, никто к нему не пойдёт. Саморегулирующаяся система! :smile:  
 
Nikolay,и Я сроду не навязывал своего мнения! Никому и никогда. И себе не позволял навязывать. И только на этом форуме неоднократно предлагал решение тех проблем, которые меня вообще не интересовали. А я уже и не знаю, с чем мне ещё придётся столкнуться - на сегодняшний момент я решил абсолютно все проблемы, с которыми столкнулся. И реализовал абсолютно всё, что я хотелреализовать.
 
Цитата
Владимир написал:
Автор ветки как никто заинтересован в её качестве, а также в притоке туда других участников! Ему и вожжи в руки! Бразды правления, в смысле. Он и будет убирать флуд и поощрять предметные дискуссии.
  Автор сможет убрать и комментарии по существу, но не приятные для него. А нам это надо?
Страницы: Пред. 1 2 3 4 5 6 7 След.
Читают тему
Наверх