<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; Static typed QLua?]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=174</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=174&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Static typed QLua?».]]></description>
		<lastBuildDate>Wed, 28 Oct 2015 14:04:53 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1754#p1754</link>
			<description><![CDATA[<p>Попалась на хабре статья, в ней автор ровно про тоже самое переживает. Там довольно многословно, говоря кратко, получаем следующее:<br /></p><ul><li><p>можно сделать свои обёрточки проверки типов аргументов и не забывать вызывать из в начале каждой функции (есть готовый код), но это же в run-time каждый раз будет выполняться!; <img src="https://quik2dde.ru/img/smilies/sad.png" width="15" height="15" alt="sad" /></p></li><li><p>для таблиц - собственно те же метатаблицы прикручивать для контроля;</p></li><li><p>рассмотрены разные готовые библиотеки, но с ними надо разбираться, синтаксис с Metalua и &quot;types&quot;&nbsp; получается и вовсе экзотическим для Lua, зато решаем задачу контроля типов (но опять в run-time?)</p></li></ul><p>[url]http://habrahabr.ru/post/76001/[/url]</p>]]></description>
			<author><![CDATA[null@example.com (korovin)]]></author>
			<pubDate>Wed, 28 Oct 2015 14:04:53 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1754#p1754</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1753#p1753</link>
			<description><![CDATA[<p>Имя таблицы в общем случае вряд ли можно получить.&nbsp; <br />Имена есть только у глобальных переменных в таблице _G, и именованных полей в таблицах, а на параметры функций и локальные переменные ссылки в байткоде - по номеру в стеке.</p><p>стандартная функция error(str) выдает трассировку стека с именами функций и номерами строк:</p><p>D:\Lua\5.1\lua.EXE: .\collar.lua:47: Error __index: wrong field name &#039;clinet_id&#039;<br />stack traceback:<br />&nbsp; &nbsp; [C]: in function &#039;error&#039;<br />&nbsp; &nbsp; .\collar.lua:47: in function &lt;.\collar.lua:46&gt;<br />&nbsp; &nbsp; collar_test.lua:6: in main chunk<br />&nbsp; &nbsp; [C]: ?</p><p>то же самое без завершения работы - print( debug.traceback())</p>]]></description>
			<author><![CDATA[null@example.com (reader)]]></author>
			<pubDate>Wed, 28 Oct 2015 13:50:56 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1753#p1753</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1750#p1750</link>
			<description><![CDATA[<div class="quotebox"><cite>CyberTrader пишет:</cite><blockquote><div class="quotebox"><cite>reader пишет:</cite><blockquote><p>3. StrictStructs - аналогичная проверка корректности имен полей в таблицах.<br />Я делал похожий скрипт, но более простой - цепляем к любой таблице мета-таблицу с функциями __newindex, __index выкидывающие ошибки и всё - при обращении к несуществующему полю таблицы тут же получаем номер строки с ошибкой, а не непонятный &quot;nil value&quot; совершенно в другом месте.</p></blockquote></div><p>Пример можете привести?</p></blockquote></div><p>Чисто для иллюстрации, можно сделать такой пример:</p><div class="codebox"><pre><code>_test_meta = {}
_test_meta.__index =
    function (table, key)
        print(&quot;Invalid key &#039;&quot; .. tostring(key) .. &quot;&#039;&quot;)
    end

t = {&quot;AA&quot;,&quot;BB&quot;,&quot;CC&quot;}

setmetatable(t, _test_meta)

print(t[1])
print(t[88])</code></pre></div><p>Причем <strong>setmetatable(<em>наша_таблица</em>, _test_meta)</strong> можно вызвать для любой (и для всех) таблиц в нашем скрипте, т.е. одной _test_meta достаточно на всё.</p><p>В результате такого скрипта получим:</p><div class="codebox"><pre><code>AA                       &lt;&lt;====  значение t[1] = &quot;AA&quot;
Invalid key &#039;88&#039;         &lt;&lt;====  диагностика про обращение в несуществующему элементы в  t[88] 
nil                      &lt;&lt;====  результат выполнения print(t[88]), он никуда не делся</code></pre></div><br /><p>Можно в проверочную функцию добавить аварийную остановку скрипта при обнаружении проблем.</p><p>Я вот только не сумел придумать как напечатать имя таблицы, к которой было обращение,&nbsp; а если бы еще номер строки - вообще супер.<br />Может кто подскажет?</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Wed, 28 Oct 2015 09:54:41 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1750#p1750</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1749#p1749</link>
			<description><![CDATA[<p>Я себя вообще не считаю программистом, что не помешало мне за этот год, используя Qlua, заработать на жизнь даже своим праправнукам. Поэтому думайте себе там что хотите.</p><p><span style="color: #FF4444"><strong>admin</strong>: <em>остальное удалено.</em></span></p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Wed, 28 Oct 2015 09:39:47 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1749#p1749</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1748#p1748</link>
			<description><![CDATA[<div class="quotebox"><cite>CyberTrader пишет:</cite><blockquote><div class="quotebox"><cite>reader пишет:</cite><blockquote><p>3. StrictStructs - аналогичная проверка корректности имен полей в таблицах.<br />Я делал похожий скрипт, но более простой - цепляем к любой таблице мета-таблицу с функциями __newindex, __index выкидывающие ошибки и всё - при обращении к несуществующему полю таблицы тут же получаем номер строки с ошибкой, а не непонятный &quot;nil value&quot; совершенно в другом месте.</p></blockquote></div><p>Пример можете привести?</p></blockquote></div><p>Легко. Сначала хотел назвать модуль struct или strict, но такие уже есть в lua, поэтому назвал collar (ошейник).<br />Описание функций:<br />match - сравнивает структуру(ключи) таблицы с эталоном с опциональной проверкой типов значений<br />update - обновляет содержимое таблицы из другой только для существующих ключей<br />merge&nbsp; - обновляет содержимое таблицы из другой (update or insert)<br />mix - назвал так чтобы не было путаницы с конструкторами. По сути не создается новый объект, а меняются свойства существующей таблицы (set metatable).&nbsp; В некоторых ООП это называется mix up.&nbsp; Идеальный вариант для таблиц, возвращаемых qlua api. Метаметоды вызываются только в случае обращения к несуществующим в таблице полям, что в 99% случаев означает ошибку (опечатку).</p><div class="codebox"><pre><code>-- collar.lua  usage:  collar = require(&quot;collar&quot;)
local collar={}

collar.pp = function (t)    -- pretty print table
    print(t,&quot;{&quot;)
    for k,v in pairs(t) do
        print(&#039;&#039;,k,v)
    end
    print(&quot;}&quot;)
end

collar.match = function (t,etalon,type_check)
    -- keys etalon is subset of keys t
    type_check = type_check or false
    local x = 0
    for k,v in pairs(etalon) do
        x = rawget(t,k)
        if x == nil then
            return false
        end
        if type_check and type(x) ~= v then
            return false
        end
    end
    return true
end

collar.update = function (t,tt) -- update only existing keys
    local ttk = 0
    for k,v in pairs(t) do
        ttk = tt[k]
        if ttk and ttk ~= v then rawset(t,k,ttk) end
    end
end

collar.merge = function (t,tt) -- update or insert {keys=values}
    for k,v in pairs(tt) do
        rawset(t,k,v)
    end
end

local function _ni(t,k,v)
    error(&quot;Error __newindex: wrong field name &#039;&quot;..tostring(k)..&quot;&#039;&quot;)
end

local function _in(t,k)
    error(&quot;Error __index: wrong field name &#039;&quot;..tostring(k)..&quot;&#039;&quot;)
end

-- attach methods to metatable
collar.mix = function(t) return setmetatable(t,{__newindex=_ni, __index=collar, }) end
-- metatable for collar
setmetatable( collar, { __index=_in, })
return collar</code></pre></div><p>Тест: collar_test.lua. Если раскомментировать строки помеченные -- typo, в них будет ошибка. Сравните с результатом без collar.<br /></p><div class="codebox"><pre><code>collar=require(&quot;collar&quot;)
collar.pp(collar)

local t={account=10000000000,client_id=&quot;APL&quot;}
collar.mix(t)

collar.pp(t) -- same as t:pp()
print(&quot;collar.match:&quot;, collar.match( t, { account=&quot;number&quot;, client_id=&quot;string&quot;})) -- true
print(&quot;collar.match(typed):&quot;, collar.match( t, { account=&quot;number&quot;, client_id=&quot;string&quot;, new_field=&quot;number&quot;}, true)) -- false

--if t.acount then -- typo
if t.account then
   print( &#039;account:&#039;, t.account)
else
   print(&#039;wrong thing&#039;)
end

--t.client_id=&quot;A&quot;.. tostring(t.clinet_id) .. &quot;E&quot; -- typo
t.client_id=&quot;A&quot;.. tostring(t.client_id) .. &quot;E&quot;
collar.pp(t)

t:update {account=1234567890, client_id=&quot;GOOGLE&quot;, junk=false}
collar.pp(t)

t:merge {account=9876543210, junk=true, any=&#039;field&#039;}
t:pp()</code></pre></div><p>p.s. Тестировал в Lua.&nbsp; В qlua не проверял.&nbsp; <br />p.p.s. 2admin что-то у вас с раскраской кода не то.&nbsp; Если в первой строке кода нет require с кавычкой - красит весь код коричневым.</p><p><span style="color: #FF4444"><strong>admin:</strong> <em>стоит модуль автоопределения языка для раскраски, не редко он, увы, ошибается; вероятно как-нибудь заменю на что-то другое.</em></span></p>]]></description>
			<author><![CDATA[null@example.com (reader)]]></author>
			<pubDate>Wed, 28 Oct 2015 08:54:37 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1748#p1748</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1747#p1747</link>
			<description><![CDATA[<p><span style="color: #FF4444"><strong>admin</strong>: <em>эмоциональное вступление и особо ударные места удалил.<br />не надо, горячие финские парни.<br />давайте по делу</em></span></p><br /><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>На Lua пишут сценарии миллионы людей для различных приложений (и как-то не жалуются).</p></blockquote></div><p>Привираете.&nbsp; Как считали? Всех пользователей WOW приплюсовали?<br />Lua не входит в топ-20 самых популярных языков по версии tiobe.&nbsp; На 20 месте pascal c 1%.&nbsp; Значит lua используют меньше 1% программистов.&nbsp; Так что его популярность - ноль целых хрен десятых.&nbsp; Можно посчитать по другому - <br />на конец 14 года на гитхабе активных проектов Lua - 8123. На luarocks - меньше 1000 проектов. Ну и чтобы два раза не вставать - не подскажете сколько вакансий программистов на Lua в мире и сколько за него платят з/п?</p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Сразу писать торговую программу (без знания языка и его особенностей) не разумно. Что вам мешает проверить критичные блоки на ошибки типизации?<br />Да, Lua требует внимания, приходится с этим мириться.<br />А от логических ошибок и отладчик не поправит и не подскажет в какой строке косяк закрался.</p></blockquote></div><p>С чего вы сделали такой вывод?<br />Я 20 лет себе на жизнь программированием зарабатываю. Работал с десятком языков программирования. Ещё пару десятков смотрел, пробовал из любопытства. Есть с чем сравнивать. С Lua знаком с 99 года с версии 4.0.&nbsp; Как альтернатива bash, awk, perl, python в некоторых случаях годится. Как универсальный язык на все случаи жизни - однозначно нет.&nbsp; Как раз мой пост - не жалобы на жизнь, а о том что с этим делать. Про логические ошибки ни слова не было.</p><p>p.s. adminу респект, оперативно модерирует.&nbsp; Разозлил меня калеказандр, ну да ладно.&nbsp; Больше не буду на его выпады отвечать.</p><p><span style="color: #FF4444"><strong>admin</strong>: <em>QLua - та данность, которая у нас есть.<br />предлагаю продолжать исключительно в русле &quot;что нам с этим теперь делать, какие инструменты для облегчения жизни использовать&quot;, что и было задано первым постом.</em></span></p>]]></description>
			<author><![CDATA[null@example.com (reader)]]></author>
			<pubDate>Wed, 28 Oct 2015 08:04:03 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1747#p1747</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1746#p1746</link>
			<description><![CDATA[<p><span style="color: #FF4444"><strong>admin</strong>: <em>наезды скорректированы, впредь просьба писать аккуратнее; я делаю так: выдыхаю, закрываю топик, а через какое-то время возвращаюсь, получается продуктивнее, на мой взгляд <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></em></span><br />Согласен, принял близко к сердцу))</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Wed, 28 Oct 2015 07:34:23 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1746#p1746</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1745#p1745</link>
			<description><![CDATA[<div class="quotebox"><cite>korovin пишет:</cite><blockquote><p>Поделитесь, какую методику вы для этого используете? для меня тоже иногда бывает проблемой.</p></blockquote></div><p>Очень просто. Берете любую функцию из QLUA.CHM, вызываете ее и выводите результат в сообщении:<br />local res = funQLUA ()<br />message(type(res))<br />Смотрите, что получилось и приводите свои переменные к этому типу или наоборот.</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Wed, 28 Oct 2015 07:32:00 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1745#p1745</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1744#p1744</link>
			<description><![CDATA[<div class="quotebox"><cite>korovin пишет:</cite><blockquote><p>Это я не понял о чем. Могли бы вы уточнить подробнее?</p></blockquote></div><p>Посмотрите соседние темы про визуальные библиотеки. Кроме VCLua ничего толком не работает. И та периодически ломается в новых версиях quik.</p><div class="quotebox"><cite>korovin пишет:</cite><blockquote><p>Есть ведь декода.</p></blockquote></div><p>Честно говоря, не пробовал.&nbsp; По отзывам на этом форуме с ней были проблемы в 13 году.&nbsp; Для моих скриптов хватало message box и логов.&nbsp; Проблема в поддержке lua в самом квике.&nbsp; Кроме кнопки запуска нет ничего. Даже порядок скриптов в списке нельзя исправить. Пример нормальной реализации макроязыка - VBA в Excel. Есть и редактор и отладчик. Можно записать макрокоманду вручную а потом посмотреть как это реализуется программным кодом.<br />Тупо прилинковать lua к сишной программе и я могу (делал в 99 году простейший генератор отчетов с lua).</p><div class="quotebox"><cite>reader пишет:</cite><blockquote><p>Вы имеете ввиду тестеры стратегий?</p></blockquote></div><p>Ну этого и сам квик не умеет.&nbsp; А вот эмулировать выставление заявок в тестовом режиме было бы полезно.</p>]]></description>
			<author><![CDATA[null@example.com (reader)]]></author>
			<pubDate>Wed, 28 Oct 2015 07:15:43 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1744#p1744</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1743#p1743</link>
			<description><![CDATA[<p>По поводу QL и её пользы я бы сказал так: подобрать все нужные параметры для того, чтобы банально подать заявку - крайне нетривиальная вещь, тем более, что примеров ARQA практически не приводит. К тому же параметры зависят и рынка. Да, когда эти параметры раз подобрал - это становится просто, но первый раз... Хотя, вероятно, тут зависит от &quot;бэкграунда&quot;: если ранее писали роботов для QUIK другими средствами автоматизации - то какие необходимо подставить параметры заявок и какие именно - много проще сообразить, конечно.</p><p>Но первый раз пробить это - довольно не просто для новичка (хотя казалоь бы, самая простая операция должна быть: подать заявку), и в этом смысле QL даёт нам готовый базис для этого, в который легко подсмотреть.</p><br /><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Что вам мешает проверить критичные блоки на ошибки типизации?</p></blockquote></div><p>Поделитесь, какую методику вы для этого используете? для меня тоже иногда бывает проблемой.<br />И тогда я вспоминаю про почти забытую ныне &quot;венгерскую нотацию&quot; - и начинаю массово её использовать в скриптах.</p>]]></description>
			<author><![CDATA[null@example.com (korovin)]]></author>
			<pubDate>Wed, 28 Oct 2015 06:47:36 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1743#p1743</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1742#p1742</link>
			<description><![CDATA[<div class="quotebox"><cite>reader пишет:</cite><blockquote><p>3. StrictStructs - аналогичная проверка корректности имен полей в таблицах.<br />Я делал похожий скрипт, но более простой - цепляем к любой таблице мета-таблицу с функциями __newindex, __index выкидывающие ошибки и всё - при обращении к несуществующему полю таблицы тут же получаем номер строки с ошибкой, а не непонятный &quot;nil value&quot; совершенно в другом месте.</p></blockquote></div><p>Пример можете привести?</p>]]></description>
			<author><![CDATA[null@example.com (CyberTrader)]]></author>
			<pubDate>Wed, 28 Oct 2015 06:17:43 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1742#p1742</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1741#p1741</link>
			<description><![CDATA[<p>reader, занимательный пост.</p><p><span style="color: #FF4444">Переформулированная фраза от <strong>admin</strong>:<br />На Lua пишут сценарии миллионы людей для различных приложений (и как-то не жалуются).</span></p><p>Сразу писать торговую программу (без знания языка и его особенностей) не разумно. Что вам мешает проверить критичные блоки на ошибки типизации?<br />Да, Lua требует внимания, приходится с этим мириться.<br />А от логических ошибок и отладчик не поправит и не подскажет в какой строке косяк закрался.<br /></p><div class="quotebox"><blockquote><p>Без вспомогательных библиотек наподобие QL сделать элементарные вещи - сформировать/выставить/передвинуть заявку, проверить её исполнение/частичное исполнение/снятие - нетривиальная задача</p></blockquote></div><p>Вот умора, какая там версия багфиксов у QL? Если вы считаете элементарные вещи нетривиальными, ну тогда ХЗ, рынок это не для вас, он сам по себе не тривиален.</p><p><span style="color: #FF4444"><strong>admin</strong>: <em>наезды скорректированы, впредь просьба писать аккуратнее; я делаю так: выдыхаю, закрываю топик, а через какое-то время возвращаюсь, получается продуктивнее, на мой взгляд <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></em></span></p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Wed, 28 Oct 2015 06:07:38 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1741#p1741</guid>
		</item>
		<item>
			<title><![CDATA[Re: Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1740#p1740</link>
			<description><![CDATA[<p>Хороший разбор, обстоятельный очень!</p><p>Что касается проблем с динамической типизацией и проверкой наличия переменных фактически лишь на этапе выполнения - тут с вами полностью согласен, часто это беда.<br />Надо будет посмотреть те средства, которые вы назвали для решения отдельных проблем, с этим связанных. За аккуратный и систематизированный список - отдельное спасибо.</p><p>Хотелось бы пару моментов уточнить, потому что они, на мой взгляд, не связаны с Lua/QLua как таковым.</p><div class="quotebox"><cite>reader пишет:</cite><blockquote><p> как следствие - сторонние модули lua c dll, не работают без пересборки</p></blockquote></div><p>Это я не понял о чем. Могли бы вы уточнить подробнее?</p><div class="quotebox"><cite>reader пишет:</cite><blockquote><p>нет дебаггера</p></blockquote></div><p>Есть ведь декода.</p><div class="quotebox"><cite>reader пишет:</cite><blockquote><p>ну и с тестированием скриптов есть проблемы</p></blockquote></div><p>Вы имеете ввиду тестеры стратегий?</p>]]></description>
			<author><![CDATA[null@example.com (korovin)]]></author>
			<pubDate>Wed, 28 Oct 2015 04:19:41 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1740#p1740</guid>
		</item>
		<item>
			<title><![CDATA[Static typed QLua?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1739#p1739</link>
			<description><![CDATA[<p>У [Q]Lua есть несколько темных сторон, которые почему-то практически не обсуждаются в рунете.<br />Хочу их тут осветить. А также обсудить, как с ними бороться.</p><p>Недостатки [Q]Lua:<br />1. Lua - довольно низкоуровневый язык, поэтому часто приходится изобретать велосипеды.&nbsp; Многие сторонние библиотеки либо дублируют функционал, либо несовместимы (примеры - реализация ООП, функции для работы со строками, регулярными выражениями, таблицами (map, reduce, etc.)).<br />2. по-умолчанию переменные - глобальные.<br />3. слишком минималистичные структуры данных - tables, которые как бы заменяют и массивы и структуры (record) и хеш-таблицы, но не на 100%. Известные багофичи - массивы с отрицательными/дробными индексами, с пропусками в нумерации.<br />4. динамическая типизация, с одной стороны, упрощает программирование, а с другой - ошибки с неправильным типом переменной или опечаткой в названии поля ловятся только во время выполнения скрипта, что для торговых алгоритмов чревато серьезными последствиями. Неоднозначная логика true|anytype/false|nil может давать побочные эффекты в выражениях x and y or z.&nbsp; Раз уж ввели тип boolean, следовало ограничить тип выражений в if, while только этим типом.</p><p>&nbsp; Для небольших разовых скриптов это не критично, но для предметной области QLua создает эффект разложенных вокруг граблей. Сюда же добавляются специфические проблемы Qlua/Quik:</p><p>5. Lua хорош как конструктор при наличии исходных кодов, когда автор программы может добавить любую С-библиотеку.&nbsp; Но с квиком ситуация другая - исходный код Qlua закрыт, разработчики решили свои проблемы - выставили API Quik в Qlua, а остальное - проблемы пользователей. </p><p>6. как следствие - сторонние модули lua c dll, не работают без пересборки, нет дебаггера ну и с тестированием скриптов есть проблемы.&nbsp; Без вспомогательных библиотек наподобие QL сделать элементарные вещи - сформировать/выставить/передвинуть заявку, проверить её исполнение/частичное исполнение/снятие - нетривиальная задача.</p><p>Что делать? <br />Гораздо лучше для всех было, если бы в квике использовалась стандартная lua dll, а qlua api было реализовано как preloaded lua модуль при инициализации интерпретатора. Да и без странного 2-поточного интерпретатора можно было обойтись. Лично я склоняюсь к мысли, что Lua в качестве языка для торгового терминала - не слишком удачный выбор. Гораздо лучше бы тут подошел какой-нибудь static typed скриптовый язык, который отлавливает большинство ошибок и опечаток во время компиляции. Из того, что я смотрел, мне понравились Angelscript, Pike, Dao. </p><p>Что можно сделать здесь и сейчас с QLua?<br />Вот что я насобирал на [url]http://lua-users.org/wiki[/url] и в интернете:</p><p>1. LuaLint (название раздела в wiki)- проводит статистический анализ глобальных переменных в скриптах lua. Сообщает о всех обращениях к необъявленным глобальным переменным, которые часто появляются из-за опечаток в именах переменных<br />2. DetectingUndefinedVariables - примеры скриптов, которые делают то же самое в рантайме (выводят ошибку при обращении к необъявленной глобальной переменной). <br />3. StrictStructs - аналогичная проверка корректности имен полей в таблицах.<br />Я делал похожий скрипт, но более простой - цепляем к любой таблице мета-таблицу с функциями __newindex, __index выкидывающие ошибки и всё - при обращении к несуществующему полю таблицы тут же получаем номер строки с ошибкой, а не непонятный &quot;nil value&quot; совершенно в другом месте.<br />4. LuaTypeChecking - проверка типов в рантайме (assert/decorators).</p><p>5. Очень многообещающий проект typedlua на гитхабе. Насколько я понял, авторы из того же бразильского университета что Р.Иерусалимский. Идея такая же как в typescript/javascript - typedlua компилируется в lua со статическим анализом типов. Можно в отдельных файлах описывать дескрипторы и структуры lua и с-библиотек. Они используются для статического анализа вызовов функций и обращения к структурам данных. Например, есть дескрипторы для всех стандартных lua-библиотек.&nbsp; Можно так же описать qlua API и qlua-таблицы!&nbsp; В общем, может заменить все вышеперечисленные костыли.</p><p>p.s. не совсем по теме, но ещё один любопытный язык, компилируемый в lua - moonscript. Синтаксис напоминает python и функциональные языки.</p>]]></description>
			<author><![CDATA[null@example.com (reader)]]></author>
			<pubDate>Wed, 28 Oct 2015 00:19:41 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1739#p1739</guid>
		</item>
	</channel>
</rss>
