<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK v2: Имитация C-like <typedef enum>]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=18020</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=18020&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK v2: Имитация C-like <typedef enum>».]]></description>
		<lastBuildDate>Fri, 08 Dec 2023 11:15:40 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159685#p159685</link>
			<description><![CDATA[<p>Ну, по всему выходит, что да - можно и так сказать. <img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (m00slim25)]]></author>
			<pubDate>Fri, 08 Dec 2023 11:15:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159685#p159685</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159684#p159684</link>
			<description><![CDATA[<p>Понял, что цель — неполноценно сымитировать enum, просто потому, что очень хотелось неполноценно сымитировать enum. Ну, ок. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 08 Dec 2023 10:56:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159684#p159684</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159683#p159683</link>
			<description><![CDATA[<p>Блин, примерно такого ответа я и ожидал... <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /><br />Ок, «мыло и мачало, начнём ка всё сначало»©<br /><strong>Цель</strong>: автоматизировать присваивание значений спискам переменных, <span class="bbu">с конкретно, и жёстко, заданными именами.</span><br />Глобальный список может быть сколь угодно гигантским - десятки, сотни переменных.<br />Глобальный список разбит на подгруппы, состоящие из единиц, десятков, значительно реже - сотен переменных.<br />Порядок присваиваемых значений целочисленный инкрементный последовательный. Может начинаться с произвольного числа, либо с нуля, если начальное значение стартовой переменной не задано.<br />Последовательность может прерываться как в рамках глобального списка, так и в рамках конкретной локальной подгруппы.</p><p>Сама задача взята из кропотливого создания врапперов для DLL библиотек, написанных на C/C++. Со всеми вытекающими.<br />Так как в исходном коде оригиналов повсеместно используется встроенный оператор <strong><em>enum</em></strong>, и возникла идея перенести (сразу оговорюсь - перенести частично!!!) поведение оператора по <span class="bbu">автоматизированному присвоению значений спискам переменных</span> в сам враппер, силами Autohotkey.<br /><strong>Ничего большего не требовалось.</strong></p><p>Надеюсь, что теперь разъяснил более детально. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>ЗЫ. Никаких полноценных свойств <strong><em>enum</em></strong> не требуется! Это просто невозможно. Константы не поддерживаются Autohotkey. Присвоение переменной внутри списка значения другой переменной из того же списка, но объявленной ранее - невозможно, throw ValueError будет итогом такой попытки.<br />Любые попытки «колдовать» над решением этих <em>невозможностей</em> - <strong>избыточны</strong>. Поэтому смысла не имеют.</p>]]></description>
			<author><![CDATA[null@example.com (m00slim25)]]></author>
			<pubDate>Fri, 08 Dec 2023 08:44:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159683#p159683</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159680#p159680</link>
			<description><![CDATA[<p>Не совсем тоже понял, в чём вопрос. Ну да, получаем сразу массив значений, без предварительного указания переменных. Аналогом переменных STD_FIRST, STD_SECOND ... будет MyArray[1], MyArray[2] ...</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 08 Dec 2023 08:08:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159680#p159680</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159678#p159678</link>
			<description><![CDATA[<p>В каком то, отдельно взятом случае, возможно - да, было бы удобнее.<br />Но для общего применения - отнюдь, первоначальный подход удобнее.</p><p>ЗЫ. И вот, кстати, я не до конца понял, либо не понял совсем. Если я в своём примере подаю на вход функции рефы на переменные, там же и объявляемые, а на выходе получаю эти переменные уже со значениями, то в Вашем примере ничего, кроме массива значений, я не увидел. Объяснитесь, пожалуйста.</p>]]></description>
			<author><![CDATA[null@example.com (m00slim25)]]></author>
			<pubDate>Fri, 08 Dec 2023 07:56:33 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159678#p159678</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159673#p159673</link>
			<description><![CDATA[<p>Я не уговариваю, но разве не проще сразу получить все значения в массиве, чем указывать все переменные по одной?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 07 Dec 2023 11:30:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159673#p159673</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159672#p159672</link>
			<description><![CDATA[<p>В случае, когда лучше сделать всё как можно проще.</p>]]></description>
			<author><![CDATA[null@example.com (m00slim25)]]></author>
			<pubDate>Thu, 07 Dec 2023 10:55:50 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159672#p159672</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159671#p159671</link>
			<description><![CDATA[<p>А в каком случае вместо переменных нельзя использовать элементы массива?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 07 Dec 2023 08:19:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159671#p159671</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159668#p159668</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Код конечно интересный. Спасибо. Но такая реализация не подойдёт.</p><p>Идея была именно в автоматической инициализации списков переменных. И реализованнго выше алгоритма пока что, на данном этапе, вполне достаточно.</p><p>В то же время, в процессе реализации, стало понятно, что полностью имитировать поведение «C-like enum» не удастся. По крайней мере без поддержки на уровне интерпретатора Autohotkey (а это, боюсь, будет та же история, что с Си-шным циклом for(statement, condition, expression) - Lexikos упорно сопротивляется любым просьбам о её реализации вот уже несколько лет).</p><p>Поэтому, я считаю, любые имитации, отходящие от начального плана - это «имитации ради имитаций». Что, в общем то, излишне.<br />Тем не менее ещё раз спасибо за интересный код.</p>]]></description>
			<author><![CDATA[null@example.com (m00slim25)]]></author>
			<pubDate>Thu, 07 Dec 2023 06:31:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159668#p159668</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159667#p159667</link>
			<description><![CDATA[<p>Вообще я для реализации объекта, похожего на Enum, использовал бы другой подход:<br /></p><div class="codebox"><pre><code>#Requires AutoHotkey v2

preset := Map(1, -5, 4, 20)
length := 5
MyEnum := Enum(preset, length)

MsgBox &#039;MyEnum: &#039; . MyEnum.toString()

MsgBox &#039;MyEnum[2]: &#039; . MyEnum[2]

try MyEnum[2] := 100
catch Error as e {
    MsgBox e.Message, &#039;Error&#039;, 16
}

MsgBox &#039;MyEnum.Length: &#039; . MyEnum.Length

try MyEnum.Length := 3
catch Error as e {
    MsgBox e.Message, &#039;Error&#039;, 16
}

try MyEnum.Push(42)
catch Error as e {
    MsgBox e.Message, &#039;Error&#039;, 16
}

class Enum extends Array
{
    __New(presetMap, length) {
        this.Length := length
        for k, v in this {
            this[k] := presetMap.Has(k) ? presetMap[k] : k = 1 ? 0 : this[k - 1] + 1
        }
        getItem := Array.Prototype.GetOwnPropDesc(&#039;__Item&#039;).Get
        this.DefineProp(&#039;__Item&#039;, {
            get: (s, i) =&gt; getItem(s, i),
            set: (*) =&gt; this.throwError(&#039;Enum element cannot be changed&#039;)
        })
        getLength := Array.Prototype.GetOwnPropDesc(&#039;Length&#039;).Get
        this.DefineProp(&#039;Length&#039;, {
            get: (s) =&gt; getLength(s),
            set: (*) =&gt; this.throwError(&#039;Enum length cannot be changed&#039;)
        })
        for method in [&#039;Delete&#039;, &#039;InsertAt&#039;, &#039;Pop&#039;, &#039;Push&#039;, &#039;RemoveAt&#039;] {
            this.DefineProp(method, {
                call: ((method, *) =&gt; this.throwError(method . &#039;() method is not defined&#039;)).Bind(method)
            })
        }
    }

    toString() =&gt; (
        str := &#039;&#039;, e := this.__Enum(2),
        [((*) =&gt; e(&amp;k, &amp;v) &amp;&amp; (str .= (k = 1 ? &#039;[&#039; : &#039;, &#039;) . v, 1))*],
        str . &#039;]&#039;
    )

    throwError(text) {
        throw Error(text)
    }
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 06 Dec 2023 19:58:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159667#p159667</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159666#p159666</link>
			<description><![CDATA[<p>Ну и поставим, так сказать, жырную точку. И закроем уже тему.<br />Миллион вызовов функции в цикле Loop: (десять аргументов без значений)</p><p>1. 4,8 секунд<br /></p><div class="codebox"><pre><code>typedef_enum(p*)
{
  for i,v in p
    %v%??%v%:=i=1?0:%p[i-1]%+1
}</code></pre></div><p>2. 6,8 секунд<br /></p><div class="codebox"><pre><code>typedef_enum(p*)
{
  e := p.__Enum(2)
  while e(&amp;i,&amp;v)
    %v%??%v%:=i=1?0:%p[i-1]%+1
}</code></pre></div><p>3. 14 секунд<br /></p><div class="codebox"><pre><code>typedef_enum(p*)=&gt;(e:=p.__Enum(2),[((*)=&gt;e(&amp;i,&amp;v)&amp;&amp;(%v%??%v%:=i=1?0:%p[i-1]%+1,true))*])</code></pre></div><p>ПС. Странный эффект от толстой стрелки. Много раз видел такое, обёртывая разнообразные вызовы DllCall в толстую стрелку - время исполнения вызова ощутимо увеличивается, даже если целевая DLL уже загружена в контекст Autohotkey.<br />Но это уже совсем другая история. <img src="//forum.script-coding.com/img/smilies/cool.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (m00slim25)]]></author>
			<pubDate>Wed, 06 Dec 2023 18:56:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159666#p159666</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159629#p159629</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Только, вызывая энумераторы подобным образом, нужно иметь в виду, что цикл <em>for k, v in obj</em> выполняется в несколько раз быстрее.</p></blockquote></div><p>Ну это же очевидно. Машинный код одного оператора, и куча интерпретируемых конструкций.<br />«Это и ежу понятно...»© <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (m00slim25)]]></author>
			<pubDate>Mon, 04 Dec 2023 11:03:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159629#p159629</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159628#p159628</link>
			<description><![CDATA[<p>Только, вызывая энумераторы подобным образом, нужно иметь в виду, что цикл <em>for k, v in obj</em> выполняется в несколько раз быстрее.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 04 Dec 2023 10:25:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159628#p159628</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159627#p159627</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Очень интересная техника. Благодарю за разъяснение!</p>]]></description>
			<author><![CDATA[null@example.com (m00slim25)]]></author>
			<pubDate>Mon, 04 Dec 2023 09:35:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159627#p159627</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159626#p159626</link>
			<description><![CDATA[<p>[( ... )*] можно записать, как Array(( ... )*). В данном случае Array() это функция с переменным количеством параметров. В такую функцию можно передавать как перечислимый объект, так и непосредственно перечислитель. Анонимная функция<br /></p><div class="codebox"><pre><code>(*) =&gt; e(&amp;k, &amp;v) &amp;&amp; (%v% ?? %v% := k = 1 ? 1 : %p[k - 1]% + 1, 1)</code></pre></div><p>имитирует поведение перечислителя, возвращая 1, когда вызов e(&amp;k, &amp;v) возвращает 1, и 0 в ином случае. Таким образом, эта анонимная функция будет вызываться, пока не вернёт 0.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 04 Dec 2023 08:51:36 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159626#p159626</guid>
		</item>
	</channel>
</rss>
