<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AutoHotkey: Eval(), или вычисление динамических выражений]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=2169</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=2169&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AutoHotkey: Eval(), или вычисление динамических выражений».]]></description>
		<lastBuildDate>Wed, 27 Aug 2008 14:51:27 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AutoHotkey: Eval(), или вычисление динамических выражений]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=13607#p13607</link>
			<description><![CDATA[<p>Поскольку в AutoHotkey переменные хранятся как символьные строки, то невозможно &quot;простым&quot; способом перевести символьную строку в выражение.<br />Иными словами, если переменная получает такое содержание 1+2*3-4, то такая строка рассматривается AHK именно как строка, а не как последовательность математических операций. Такое содержание переменная может получить, например, при чтении файла командой <strong>FileRead </strong>или кучей других способов. Главное, - что нет возможности написать ЗАРАНЕЕ:<br /><strong>Res := 1+2*3-4</strong><br />(Вот <a href="http://forum.script-coding.com/viewtopic.php?id=2151">здесь</a>, кстати, можно посмотреть и соответствующую ситуацию и способ её решения.)</p><p>Для таких случаев, в WSH есть функция <strong>eval()</strong>. А в AutoHotkey такой функции нет. А теперь есть <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />. Вот она.<br /><strong>Функция вычисляет динамическое выражение, результатом которого может быть числовое значение.</strong><br />Динамическое выражение - выражение, полученное в процессе выполнения скрипта.<br />Эту функцию я практически целиком взял <a href="http://www.autohotkey.com/forum/topic5685.html">с английского форума</a>. Только слегка её шлифанул.<br /><strong>Вот сама функция:</strong><br /></p><div class="codebox"><pre><code>;-------------------------------------------------------------------------------
Eval( _String ) ; Функция вычисляет динамическое выражение
{
    ; В качестве параметра функция принимает строку, содержащую выражение

    pid := DllCall( &quot;GetCurrentProcessId&quot; )
    VarSetCapacity( buffer, 100, 1)
    pBuffer := &amp;buffer

    ; задаём имя временного скрипта
    FormatTime, TimeString,, yyyy.MM.dd-HH.mm.ss
    TempScript = %A_Temp%\%TimeString%.ahk

    ; пишем содержимое временного скрипта
    FileAppend,
    (    LTrim
        #NoTrayIcon
        expression := %_String% ; вот, собственно, из-за чего весь огород

        ; 0x8|0x20 = PROCESS_VM_OPERATION|PROCESS_VM_WRITE
        hp_parent := DllCall( &quot;OpenProcess&quot;
                            , &quot;UInt&quot;, 0x8|0x20
                            , &quot;Int&quot;, 0
                            , &quot;UInt&quot;, %pid% )

        ; результат вычислений - в память вызывающей функции
        ; (отвязываемся от этого временного скрипта)
        DllCall( &quot;WriteProcessMemory&quot;
                , &quot;UInt&quot;, hp_parent
                , &quot;UInt&quot;, %pBuffer%
                , &quot;UInt&quot;, &amp;expression
                , &quot;UInt&quot;, StrLen( expression )+1
                , &quot;UInt&quot;, 0 )

    ), %TempScript%

    RunWait, %TempScript% ; запускаем временный скрипт
    FileDelete, %TempScript%
    Return, buffer
}
;-------------------------------------------------------------------------------</code></pre></div><p><strong>Вот пример её применения:</strong><br /></p><div class="codebox"><pre><code>#Include Eval().ahk
Str = 1+2*3-4
;~ Str := Clipboard ; если скопировать к-либо выражение в буфер обмена
value := Eval( Str )
MsgBox, %Str% = %value%</code></pre></div><p><strong>Или забрать скрипт с примером и описанием. <span class="bbu">Рекомендую</span>:</strong></p>]]></description>
			<author><![CDATA[null@example.com (Androgen)]]></author>
			<pubDate>Wed, 27 Aug 2008 14:51:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=13607#p13607</guid>
		</item>
	</channel>
</rss>
