<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK v2: Имитация C-like <typedef enum>]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=18020&amp;type=atom" />
	<updated>2023-12-08T11:15:40Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=18020</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159685#p159685" />
			<content type="html"><![CDATA[<p>Ну, по всему выходит, что да - можно и так сказать. <img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[m00slim25]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33666</uri>
			</author>
			<updated>2023-12-08T11:15:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159685#p159685</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159684#p159684" />
			<content type="html"><![CDATA[<p>Понял, что цель — неполноценно сымитировать enum, просто потому, что очень хотелось неполноценно сымитировать enum. Ну, ок. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-12-08T10:56:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159684#p159684</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159683#p159683" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[m00slim25]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33666</uri>
			</author>
			<updated>2023-12-08T08:44:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159683#p159683</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159680#p159680" />
			<content type="html"><![CDATA[<p>Не совсем тоже понял, в чём вопрос. Ну да, получаем сразу массив значений, без предварительного указания переменных. Аналогом переменных STD_FIRST, STD_SECOND ... будет MyArray[1], MyArray[2] ...</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-12-08T08:08:05Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159680#p159680</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159678#p159678" />
			<content type="html"><![CDATA[<p>В каком то, отдельно взятом случае, возможно - да, было бы удобнее.<br />Но для общего применения - отнюдь, первоначальный подход удобнее.</p><p>ЗЫ. И вот, кстати, я не до конца понял, либо не понял совсем. Если я в своём примере подаю на вход функции рефы на переменные, там же и объявляемые, а на выходе получаю эти переменные уже со значениями, то в Вашем примере ничего, кроме массива значений, я не увидел. Объяснитесь, пожалуйста.</p>]]></content>
			<author>
				<name><![CDATA[m00slim25]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33666</uri>
			</author>
			<updated>2023-12-08T07:56:33Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159678#p159678</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159673#p159673" />
			<content type="html"><![CDATA[<p>Я не уговариваю, но разве не проще сразу получить все значения в массиве, чем указывать все переменные по одной?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-12-07T11:30:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159673#p159673</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159672#p159672" />
			<content type="html"><![CDATA[<p>В случае, когда лучше сделать всё как можно проще.</p>]]></content>
			<author>
				<name><![CDATA[m00slim25]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33666</uri>
			</author>
			<updated>2023-12-07T10:55:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159672#p159672</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159671#p159671" />
			<content type="html"><![CDATA[<p>А в каком случае вместо переменных нельзя использовать элементы массива?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-12-07T08:19:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159671#p159671</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159668#p159668" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong><br />Код конечно интересный. Спасибо. Но такая реализация не подойдёт.</p><p>Идея была именно в автоматической инициализации списков переменных. И реализованнго выше алгоритма пока что, на данном этапе, вполне достаточно.</p><p>В то же время, в процессе реализации, стало понятно, что полностью имитировать поведение «C-like enum» не удастся. По крайней мере без поддержки на уровне интерпретатора Autohotkey (а это, боюсь, будет та же история, что с Си-шным циклом for(statement, condition, expression) - Lexikos упорно сопротивляется любым просьбам о её реализации вот уже несколько лет).</p><p>Поэтому, я считаю, любые имитации, отходящие от начального плана - это «имитации ради имитаций». Что, в общем то, излишне.<br />Тем не менее ещё раз спасибо за интересный код.</p>]]></content>
			<author>
				<name><![CDATA[m00slim25]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33666</uri>
			</author>
			<updated>2023-12-07T06:31:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159668#p159668</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159667#p159667" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-12-06T19:58:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159667#p159667</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159666#p159666" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[m00slim25]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33666</uri>
			</author>
			<updated>2023-12-06T18:56:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159666#p159666</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159629#p159629" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[m00slim25]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33666</uri>
			</author>
			<updated>2023-12-04T11:03:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159629#p159629</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159628#p159628" />
			<content type="html"><![CDATA[<p>Только, вызывая энумераторы подобным образом, нужно иметь в виду, что цикл <em>for k, v in obj</em> выполняется в несколько раз быстрее.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-12-04T10:25:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159628#p159628</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159627#p159627" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong><br />Очень интересная техника. Благодарю за разъяснение!</p>]]></content>
			<author>
				<name><![CDATA[m00slim25]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33666</uri>
			</author>
			<updated>2023-12-04T09:35:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159627#p159627</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK v2: Имитация C-like <typedef enum>]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=159626#p159626" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2023-12-04T08:51:36Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=159626#p159626</id>
		</entry>
</feed>
