Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
s_mike@rambler.ru написал: в первом примере не раскрыто содержимое таблицы, являющеся ключом. Сериализация это подразумевает. Таблица ключа может содержать вложенные таблицы, которые также должны быть раскрыты.
Я при описании dump_tbl ни разу не упоминал про сериализацию и в этой функции ключи типа table, userdata и function не раскрываются. Для них выдается их служебный код (ссылка).
Цитата
s_mike@rambler.ru написал: во втором случае результат явно неверен. "a" и "a\0b" - совершенно разные строки.
Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.
Цитата
s_mike@rambler.ru написал: в третьем случае 1.#inf не является допустимым числом lua. Это всего лишь нерегламентированное внутреннее представление, которое не может попадать в результат.
Результат 1.#inf выдает Lua и я не собираюсь переделывать его.
local function escape ( s )
s = tostring ( s ):gsub ( "\n", "\\n" )
return s
end
local function dumpstr ( t, alias, seen )
seen = 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
for k, v in pairs ( t ) do
s = string.format ( "%sk %s %s\nv %s %s\n", s, type ( k ), alias[ k ] or escape ( k ), type ( v ), alias[ v ] or escape ( v ) )
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 dumpfile ( file, t, alias, seen )
seen = seen or { }
if seen[ t ] then return else seen[ t ] = true end
file:write ( string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ) )
local mt = getmetatable ( 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 unescape ( s )
s = s:gsub ( "\\n", "\n" )
return s
end
local function loadstr ( s, alias )
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
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 tlist[ nt ] = tlist[ nt ] or alias[ nt ] or { }; tcurr = tlist[ nt ]; troot = troot or tcurr
elseif mt then tlist[ mt ] = tlist[ mt ] or alias[ nt ] or { }; setmetatable ( tcurr, tlist[ mt ] )
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 )
elseif kt == 'string' then kcurr = alias[ k ] or unescape ( k )
else kcurr = alias[ 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 )
elseif vt == 'string' then tcurr[ kcurr ] = alias[ v ] or unescape ( v )
else tcurr[ kcurr ] = alias[ v ]
end
end
end
return troot
end
Выгрузка таких вещей как функции (особенно встроенные) и юзердата не предусмотрено, так что надо передавать список строковых псевдонимов в формате { ["math.max"] = math.max, ["getUniqueID"] = getUniqueID, ... }.
s_mike@rambler.ru написал: во втором случае результат явно неверен. "a" и "a\0b" - совершенно разные строки.
Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.
Lua использует бинарные строки с указанной длиной. Указанные строки - разные, и Lua будет их считать разными; при выгрузке в файл значения разные (и совпадающие со входящими). То что они отобразились одинаково это вероятно из-за того, что в используемом терминале используется С стандарт строк с нуль-терминатором.
Немного доработанный код. Вроде справляется со всем, включая NaN. Все виды кодировок текста совместимые с ASCII должны работать без проблем. После загрузки всех модулей надо вызвать addalias() чтобы подцепить все функции, что не добавилось - добавить вручную. Для дампа есть вариант сразу в файл на случай если у вас данные на несколько гигабайт. Велосипед под лицензией MIT, берите-катайтесь.
TGB, выгружает _G в строку за 10 мсек, в файл за 2 мсек.
Код
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
for k, v in pairs ( t ) do
s = string.format ( "%sk %s %s\nv %s %s\n", s, type ( k ), alias[ k ] or escape ( k ), type ( v ), alias[ v ] or escape ( v ) )
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 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 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
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 tlist[ nt ] = tlist[ nt ] or alias[ nt ] or { }; tcurr = tlist[ nt ]; troot = troot or tcurr
elseif mt then tlist[ mt ] = tlist[ mt ] or alias[ nt ] or { }; setmetatable ( tcurr, tlist[ mt ] )
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 )
else kcurr = alias[ 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 )
else tcurr[ kcurr ] = alias[ v ]
end
end
end
return troot
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' then
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,про бинарные строки вам уже рассказали. Собственно эта информация прямым текстом написана в третьем параграфе первой главы, т.е. в самом начале инструкции - которую вы очевидно не читали. Так что пожалуйста прочитайте, целиком и полностью. Перед тем как делать библиотеки для других людей, сначала убедитесь что ваши познания и умения находятся на уровне повыше плинтуса.
Артем, На заборе тоже много чего написано. Если составлять описание здешних глюков, наверное, многотомник получится - и хоть что-нибудь было бы описано! А читать про строки, да еще "целиком и полностью"... Строка - это непрерывная последовательность элементов (например, байтов), оканчивающаяся терминатором. Точка. О ЧЁМ здесь вообще можно читать? КАКИМ ОБРАЗОМ чтение всей этой бредятины может поднять "ваши познания и умения находятся на уровне повыше плинтуса"? Из любого дерьма, из любой элементарщины проблему сделают...
Тут как говорится, нечего на зеркало пенять если рожа крива. Не знаете языка, а глаголите как будто сопоставимо экспертному мнению, а не пердежу в лужу. Будете иметь весомое мнение, когда хотя-бы выучите формальное определение языка, про реальную имплементацию в коде уж не будем заикаться.
Артем, Да вот как раз я-то язык знаю. Я чуть ли не единственный на этом форуме, кто написал скрипт на девственно чистом Lua. Есть ещё такие? Поднимите руки! Нет? Тогда НЕ ВАМ что-то мне говорить о знании языка.
Владимир, argumentum ad verecundiam. Вы эксперт в C, Prolog, Fortran, ассебмлер Z80? В Lua вы не эксперт. Тоже, пожалуйста, прочитайте инструкцию - в этом языке она очень короткая. Почерпнёте много нового.
Артем, Ответьте на вопрос! Есть такие? Нет? Тогда ИМЕННО Я И ЕСТЬ "эксперт в Lua"! Я на нём ПОЛНОСТЬЮ реализовал всё, что я хотел. Алгоритм давно уже торгует лучше меня, а недавно я признал его безоговорочное превосходство, я больше не хочу "путаться у него под ногами". Вот и сегодня он приподнял мой портфель на полпроцента. Наверное, до конца сессии ещё чт-нибудь наковыряет. Что мне ещё желать? НА КОЙ мне читать инструкцию? Мне больше НЕЧЕГО оттуда почерпнуть!
На ассемблере Z80 не писал никогда (писал н трёх других ассемблерах). Равно как и н Прологе. На Фортране последний раз писал лет 30-40 назад. На C - да, "эксперт". Но не на С++.
Владимир, спасибо за торговую информацию. Я начинал писать робота без надежды на прибыль, считая что точность технического анализа будет приближаться к броску монетки в силу турбулентности рынка. Но видя что алгоритмический робот может надёжно торговать в плюс, мне теперь кажется что и мой нейронный робот тоже будет хорошо справляться.
По поводу экспертизы я уже сказал - кто не знает языка в полной мере тот не эксперт как ни крути. Это примерно как Вася-токарь с опытом 40 лет, который вручную точит хорошие детали, но так и не умеет пользоваться блоком ЧПУ и особо ядрёные чертежи ему не по зубам, хотя станок справился бы.
Артем, А я начинал писать робот, хорошо представляя, что именно и как именно он будет делать. В процессе написания, конечно, кое-что поменялось, но базовые принципы остались в неприкосновенности. Ежу понятно, что "алгоритмический робот может надёжно торговать в плюс", а вот нейронный робот" сдохнет, а не справится.
А я как раз знаю язык в полной мере. ВСЁ, что я хотел написать, я написал с его помощью, ВСЁ, для чего он предназначен, реализовал. Куда ещё "полнее мера"? А уж сравнивать такое убожество, как Lua хотя бы со станком с ЧПУ и вообще смешно. Хуже языка мне пока что не попадалось!
Владимир, в поисках плохих языков далеко ходить не надо - C++, Java, Rust - мы все о них слышали. Lua это один из хороших языков, рядом с C и Python.
Легко наверное жить когда уровень ЧСВ еще выше чем уровень IQ. Когда нейронный робот запустится, я с вами поделюсь данными о монетарной производительности.
Артем, Не стоит, сударь, не стоит. Вы для меня не авторитет, Вы для меня НИКТО. А что Lua есть глючное убожество, говорится в доброй половине моих комментариев на этом форуме ДОКАЗАТЕЛЬНО говорится, а не голословно "один из хороших языков".
Владимир, буду надеяться что нейросеть будет работать как описано - извлекать скрытые и неизвестные зависимости в голом потоке данных и воспроизводить их. На друих задачах итоговая точность обычно составляет от 85% до 99% - для фондового рынка я пологаю что величина будет значительно ниже. Однако базовый анализ авторегрессором показывает значительную корреляцию, так что резонно пологать что итоговая точность будет значительно выше 50%, чего будет достаточно для торговли в плюс. В такой ситуации вам не останется выбора, кроме как признать мою авторитетность в этом поле деятельности.
К нейросетям я всегда относился полунасмешливо, и ещё за много лет до того, как сам начал торговать, предлагал их сторонникам: "Запустите свои сети на биржу, и пусть там торгуют. Когда разоритесь - скажете".
Сидят в песочнице зверята и хвастаютя: "Я дальше всех умею прыгать", - говорит Зайчонок. "А я быстрее всех бегаю в колесе", - говорит Бельчонок. Медвежонок слушал-слушал и говорит: "А я…, а у меня… А я вам щас всем пи[цензура] дам!"
Владимир написал: К нейросетям я всегда относился полунасмешливо
Зря. GPT-3 уже может писать книги, программировать на декларативных языках, и делать арифметику в уме (т.е. без использования программы-калькулятора) до пятизначных слагаемых. GPT-4 не за горами, и он возможно сам сможет написать GPT-5.
Артем, И что? Я тоже могу "писать книги, программировать на декларативных языках, и делать арифметику в уме до пятизначных слагаемых". Пушкиным мне всё равно не быть, даже близко, как и всем этим GPT-12345. Вон, про Глубокого Голубого тоже бурные ахи-вздохи были, а потом в Джакарте Фриц всего лишь на 90-МГц пне вздрючил его, так его сразу и разобрали на запчасти.
В любом случае, всё это какая-то статистическая обработка чего-то там, а потому она может воспроизводить лишь поведение СТАДА - на творческие, нестандартные решения все эти нейросети неспособны по определению.
Бегло полистал Вики: Чат-боты... "технология пока очень далека от реального применения в здравоохранении"... Разработчики опасаются, что GPT-3 может быть использована для спама, домогательств, радикализации, дезинформации или астротурфинга... GPT-3 демонстрирует «значительные улучшения» в создании экстремистских текстов по сравнению со своим предшественником GPT-2... "многие ожидания по поводу способностей больших языковых моделей вроде GPT-3 являются совершенно нереалистичными"... пытаться построить интеллектуальные машины путём масштабирования языковых моделей — всё равно что строить высотные самолёты для полёта на Луну...
Артем, Чтобы узнать, что яйцо тухлое, не обязательно съесть его целиком.(с) Вы возразите хоть полслова по существу сказанного мною? Очень сомневаюсь. Ибо сказано вполне профессионально. Я знаю о нейросетях ДОСТАТОЧНО.
Оформляю свой последний алгоритм для скрипта (автоудаление заявок по таймеру, алгоритм я где-то выше описывал). Поменял алгоритм генерации транзакций на тот, который посоветовал Игорь М. У одного брокера (версия Квика 8.11.0.66) заявки принимаются нормально, у другого (8.7.1.3) после отправки транзакции выскакивает: "Указанный счёт депо не найден". Какой, в задницу, "счёт депо"?! Я ваще не знаю, что это такое!
Приключения на этом не кончились (а только начались). У того брокера, у которого заявки всё-таки принимаются, начались приключения в OnTrade. Вывожу отладочную печать на входе: OnTrade: transID=744549 OrderID=21985300239 Trade=373210739 Всё правильно, именно такой transID и был отправлен.
Теперь я начинаю искать эту транзакцию в массиве сделок данного (i-го) тикера: for j=1,a[i][12][0][0] do ... в этом массиве сейчас только ОДНА строка, сформированная функцией подачи заявки:
Код
j=a[i][12][0][0]+1; -- количество заявок для тикера увеличилось
a[i][12][0][0]=j; -- записываем количество заявок в паспорт
a[i][12][j]={}; -- массив паспортов сделок
a[i][12][j][0]=A.TRANS_ID; -- ID заявки (пока транзакции) в системе
a[i][12][j][1]=0; -- сделок по этой заявке ещё нет
a[i][12][j][2]=n; -- количество оставшихся лотов по заявке
a[i][12][0][1]=C+10; -- счётчик 15-секундных тиков до закрытия заявок
Смотрим - и в самом деле: F:write("i="..i..", j="..j..", N="..a[i][12][0][0]..", 0="..a[i][12][j][0]..", 1="..a[i][12][j][1]..", 2="..a[i][12][j][2].."\n"); Результат: i=1181, j=1, N=1, 0=744549, 1=0, 2=1
Теперь смотрим, наша ли это заявка (здесь, как водится, начала выдрипываться динамическая типизация - пришлось завернуть в tostring):
Код
if tostring(a[i][12][j][0])==tostring(n.trans_id) and a[i][12][j][1]==0 then
F:write("Первая сделка: i="..i..", j="..j.."\n");
goto LSetTradeData;
end; -- конец условия совпадения заявок
end; -- конец цикла поиска
И снова всё прекрасно: Первая сделка: i=1181, j=1
А теперь прыгаем на LSetTradeData, и первым же делом ставим печать: ::LSetTradeData:: F:write("i="..i..", j="..j..", N="..a[i][12][0][0].."\n"); Результат: i=1181, j=1181, N=1
Продолжайте в том же духе оформлять свой код - не то еще будет.
Никаких проблем с подачей транзакции и поиском ответов, если он пришел, нет. А то что Вы не знаете что такое счет депо только подтверждает, что предметная область Вами не усвоена.
Nikolay, Проблемы ЕСТЬ, и я их ПЕРЕЧИСЛИЛ. Более того: тот самый счёт, которого у этого придурка "нет" - это именно МОЙ счёт, и он отображается в диагностике ПРАВИЛЬНО, и при старой технике формирования айдишек транзакций он его прекрасно находил (а второго брокера и сейчас прекрасно находит! Ну, а уж про порчу переменных у меня просто слов нет - как можно изуродовать ассемблерный JMP, чтобы он стал выдавать такую херню?!
Владимир написал: Ну, а уж про порчу переменных у меня просто слов нет - как можно изуродовать ассемблерный JMP, чтобы он стал выдавать такую херню?!
Местный дурач0к по прежнему не читает документацию.
Цитата
Second, the control variable is a local variable automatically declared by the for statement and is visible only inside the loop. A typical idiot's mistake is to assume that the variable still exists after the loop ends
swerg, Да в гробу я видел ТАКУЮ "документацию" - это дерьмо пущай умники читают.
Справка для особо одарённых: 1. Это НЕ ЕСТЬ "variable automatically declared by the for statement and is visible only inside the loop" - переменная явно объявлена в самом начале функции:
Код
function OnTrade(n) -- обработчик прерывания по приходу сделки
local i,j,k,s; -- вспомогательные переменные
2. Эта переменная видна НЕ ТОЛЬКО в теле цикла и активно используется в теле функции.
3. У нормальных языков (С) такие локальные переменные заводятся в стеке и до выхода из функции ни одна сволочь не имеет права её уничтожить, а у криворуких бездарей, ессно, "typical idiot's mistake".
swerg, Ах, да - по выходу из цикла эта переменная всё-таки СУЩЕСТВУЕТ, только её значение "волшебным образом" изменяется с ID сделки тикера на ID самого тикера! И, поскольку в начале функции стоит:
Код
j=N; -- невозможное значение индекса тикера
for i=0,N-1 do -- цикл по тикерам (поиск нужного)
if a[i][0]==n.sec_code then j=i;break;end;end;
if j==N then goto q;end; -- тикер не найден
i=j; -- компенсация глюка с переменной цикла
то, очевидно, в циклах используется НЕ ТА i и НЕ ТА j. А это уже просто гимн языку!
Владимир, про область видимости переменных в университете не проходили? Или вы уроки лекции прогуливали? Лекции о форматирование кода и именовании переменных тоже видимо мимо вас прошли.
Артем, Нет, не проходили. Лекции - да, частенько прогуливал, но средний балл у меня в институте был 5.00. И собственными мозгами допетрил, что если явно объявленную переменную подменяют какой-то левой своей, то это есть маразм.
Артем, Я, милок, нередко ПИСАЛ документацию, и молиться на всякое дерьмо не намерен. На мой взгляд, это кретинизм, проявления которого тоже придётся компенсировать собственным кодом.
Владимир, Я на иностранных форумах как-то байку слышал, что там программистов за 35 на работу не берут, особенно в таких местах как Сан-Франциско. Видимо по причине вот такого подхода к делу у ветеранов программирования. Я программирую уже 15 лет, видимо мне осталось где-то еще 15-25 пока катушка не съехала.
Артем, Я, лапуль, байки на иностранных форумах не читаю, но со многими забугорными программистами был знаком лично. В частности, с человеком, который был признан лучшим программистом мира 1993 года. И даже с ещё более крутыми (но менее титулованными). Да и вообще, мне сам Кен Томпсон руку пожимал!
Я не знаю, какой там в Вашем представлении "вот такой подход к делу у ветеранов программирования", но у вас, нахватавшихся в своих университетах всякой дребедени, подход явно радикально иной. В самом деле: у нас, "ветеранов", просто крыша едет, когда язык пилюёт на явно объявленные программистом переменные, заводит вместо них свои (с теми же именами!) и работает по ним. Зашибися! А для вас это нормально? Надеюсь, в вашей долбаной "документации" сие гениальное действо подробно описано? Оно того стоит!
local i = -999
for i = 1, 100 do
if math.random ( 0, 9 ) == 0 then
print ( i )
break
end
end
print ( i )
Код
#include "stdio.h"
#include "stdlib.h"
int main ( int argc, char ** argv )
{
int i = 0;
for ( int i = 1; i < 100; i++ )
{
if ( rand ( ) % 10 == 0 )
{
printf ( "%d\n", i );
break;
}
}
printf ( "%d", i );
return 0;
}
Можете начинать аргументировать почему С это плохой язык.
Артем, Во-первых, я никогда не говорил, что "С это плохой язык". Наоборот, я говорил, что C мой наилюбимейший язык на протяжении десятилетий. Во-вторых, Ваш пример вовсе не на C, а на C++, про который я писал в своей книге: С языком всё просто – немного перефразируя Генри Форда: «Любой модуль SINT может быть написан на любом языке программирования при условии, что это язык C». И это почти не шутка: эффективность C сравнима с ассемблером, он пригоден для решения подавляющего большинства задач, поддерживается всеми платформами, удобен для программиста – удобен настолько, что искать что-либо лучшее просто не хочется. Причём именно C, но не C++, который был нами отвергнут из-за крайне неудачной реализации (я бы даже сказал «дискредитации») идей объектного программирования.
Артем, Я его и не собирался компилировать! Просто в С нет этого маразма с объявлением переменных внутри блоков. Хотя здесь они, по крайней мере, объявляются, в отличие от Lua. Я всю жизнь пользуюсь компиляторами С++, но только потому, что там есть строчные комментарии - ЕДИНСТВЕННОЕ, что можно оттуда взять полезного! Я когда-то где-то читал, как Керниган плакался: "Ну как же это мы забыли про строчные комментарии"? Во всём остальном ставить рядом Страуструпа и Кернигана с Ричи просто нельзя - у них совершенно разные весовые категории.
Владимир, использовать в тысячу раз более тяжеловесный и в целом несовместимый язык ради однострочных комментариев - ну-ну. Это при том что в изначальном собственно языке они тоже доступны, надо только инструкцию прочитать.
Я не язык использую, лапуль, а компилятор. Кстати, почти никогда "тяжеловесный" - мой любимый BC3.1. Иногда использовал Watcom, иногда GNU. Ни в одном из них никакой "тяжеловесности" не было. И программы нга выходе всегда смешного размера - я не помню, была ли хоть одна объёмом свыше сотни килобайт.
НЕ БЫЛО изначальном языке строчных комментариев! И если Ваша долбана инструкция утверждает обратное, засуньте её... сами знаете куда.