Инструменты пользователя

Инструменты сайта


ru:autorun:documentation:syntax_type

Виды синтаксиса

Начиная с версии 3.0 в Autorun появилась возможность полноценного использования условий и выражений с «функциональным синтаксисом» или в «функциональной записи» в дополнение к классическому «командному синтаксису» или «командной записи». В дальнейшем в справке будут использоваться термины «функциональная запись» и «командная запись».

Командный синтаксис

В ранних версиях Autorun (до момента, когда появились условия) использовался только один вид синтаксиса — командный. Этот вид синтаксиса широко используется для передачи приложению параметров в командной строке и обычно включает в себя список параметров, следующих один за другим, и переключателей, которые могут располагаться в произвольном порядке (в Autorun переключатели должны располагаться до параметров). В примере ниже будет запущена 64-битная версия Total Commander в свёрнутом состоянии:

ShellExec /SW_MINIMIZE "%COMMANDER_PATH%\Totalcmd64.exe"

Этот вид синтаксиса использует разделение параметров пробелами. Если в тексте параметра содержится пробел, то параметр берётся в кавычки. Также текст параметров может содержать переменные Autorun или переменные окружения. В примере выше %COMMANDER_PATH% — это переменная окружения, содержащая путь к Total Commander.

К плюсам такого синтаксиса можно отнести: простоту записи и обработки параметров, возможность в относительно компактной записи реализовывать сложную логику.

Но есть и минусы. При большом количестве переключателей и параметров становится сложнее интуитивно понять, что именно делает их комбинация. Если команда должна возвращать значение, такая запись становится неудобной. Также практически невозможно использовать команды напрямую в выражениях (в частности в условиях).

:i: Важная особенность записи команд в этом синтаксисе: вычисляемые строки в параметрах выполняются после входа в команду. В функциональном синтаксисе выражения в параметрах выполняются перед входом в функцию. В настоящее время это имеет значение только для команд, реагирующих на события (ControlSetMouseAction, SetHotkeyAction, SetMessageAction), поскольку они выполняют другие команды.

Функциональный синтаксис

Функциональный синтаксис призван решить недостатки командного. Такой способ записи (с вариациями) широко используется в большинстве языков программирования. Пример:

p = StrPos("abcdefgh", "cd")
# p = 3

В результате в переменную «p» будет записан результат выполнения функции 3 (позиция подстроки).

Функциональный синтаксис удобен для использования в выражениях: в операциях присваивания, условиях, определениях функций. Например:

if StrPos("abcdefgh", "cd") = 3 then MsgBox("Yes")

В этом коде: если позиция подстроки равна 3, то вызывается команда MsgBox, выдающая сообщение.

В отличие от командного синтаксиса использовать переменные прямо в тексте здесь нельзя (за исключением команд, для которых явно указано, что они разворачивают переменные). Переменная находится в выражении отдельно. Что нужно делать с её значением, определяется стоящими рядом операторами:

a = 1
b = a + 1 # --> b = 2, сложение
b = a & 1 # --> b = "11", конкатенация (соединение двух строк)

Интерпретация функционального синтаксиса

Исторически сложилось, что сначала в выражениях строки были «нестрогие», т.е. допускалось написание строк без обрамляющих кавычек (аналогично командному синтаксису). К сожалению, желание сохранить полную совместимость на том этапе ограничивало возможности плагина и мешало дальнейшему развитию. Поэтому при написании актуальной версии было принято решение поменять настройки интерпретации выражений по умолчанию, но оставить возможность использовать предыдущий вариант как опцию.

Интерпретация определяется директивой LegacyExpressions. При её наличии будет использоваться старая интерпретация.

Различия между актуальной и старой реализацией следующие:

Актуальная:

  1. Все строки должны быть в кавычках (любых из двух типов).
  2. Переменные в выражениях используются без символов %, но могут быть и заключены в них.
  3. При использовании в выражении отсутствующей переменной выдаётся ошибка.
  4. Нет неоднозначностей в выражениях.

Предыдущая:

  1. Строки могут быть в кавычках (любых из двух типов) либо без кавычек, но только если строка не содержит пробелов и разделителей.
  2. Переменные должны быть заключены в %.
  3. В случае отсутствия переменной возвращается само имя переменной, ошибок не выдаётся.
  4. Возможны неоднозначности в выражениях, что может привести к сложнодиагностируемым ошибкам.

Хотя в целом скрипты будут работоспособны в обоих вариантах, настоятельно рекомендуется использовать актуальный вариант, так как он исключает возможные неопределённости в интерпретации строк и выдаёт сообщения об ошибках с переменными, что упрощает отладку.

Некоторые примеры работы двух интерпретаций:

# Актуальный
a = "zxc"                # -- ок
c = %a%                  # -- ок, присвоит значение a
c = a                    # -- ок, присвоит значение a
b = StrLen("qwerty")     # -- ок
b = StrLen(%a%)          # -- ок
b = StrLen(a)            # -- ок
b = StrLen(a & "qwerty") # -- ок
 
# Старый
a = "zxc asd"               # -- ок
a = zxc                     # -- ок
c = %a%                     # -- ок, присвоит значение a
c = a                       # -- ок, присвоит строку "a"
b = StrLen(qwerty)          # -- ок
b = StrLen("qwerty")        # -- ок
b = StrLen(%a%)             # -- ок
b = StrLen(a)               # -- ок, вернет "1", длину строки "a"
b = StrLen("qwerty asdf")   # -- кавычки обязательны, т. к. пробел
b = StrLen("qw(er)ty,asdf") # -- кавычки обязательны, т. к. в строке есть разделители ",()"
b = StrLen(%a% & qwerty)    # -- ок
 
# Пример неоднозначности:
While %h% > 0
  h = %h% - 1
Wend
# При отсутствии объявленной переменной h произойдет немедленный 
# выход из цикла, т. к. будет возвращено "%h%" — строка, 
# которая не приводится к числу, следовательно = 0
ru/autorun/documentation/syntax_type.txt · Последнее изменение: 2022/10/17 19:03 — loopback

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki