Spray
Новичок
- Сообщения
- 17
- Репутация
- 2
- Версия AutoIt
- 3.3.14.5
- Версия
- 0.5.0
Plys представляет собой незаметную обёртку, дополняющую язык AutoIt следующими возможностями:
Минусы такого подхода: во-первых, пользователь всё равно может «выстрелить себе в ногу», случайно или намеренно используя функцию из другого файла по имени с заданным префиксом, во-вторых, код с префиксами становится громоздким, что сказывается на читаемости, а как известно, код чаще читается, чем пишется.
Эту проблему решает #import: во-первых, он, в отличие от #include, предоставляет доступ только к публичным именам подключаемого файла (отмечаются звёздочкой в конце имени при объявлении, например const Foo* = 42), во-вторых, в подключаемом файле префиксы больше не нужны — доступ к ним из другого файла всё равно будет запрещён, пока программист явно не разрешит.
В AutoIt Plys блоки кода определяются отступами и «закрывашки» являются необязательными. Но за отступами придётся последить. И это хорошо: код без отступов читать невозможно: и постороннему программисту, и вам, если вы давно не работали с проектом. И это несложно: любой адекватный текстовый редактор для программирования автоматически делает отступы.
AutoIt Plys воспринимает аргументы функций по умолчанию как константы, преследуя вышеописанную цель: помочь пользователю в обнаружении ошибок. Да, в чистом AutoIt можно явно указать const перед именем аргумента, но об этом как правило забывают, да и, опять же, дополнительные префиксы не добавляют коду читаемости.
Зачем эти навороты в простом скриптовом языке AutoIt? Почему бы просто не перейти на Python/Ruby/Lua/Basic? AutoIt чертовски хорош, и даже если сценарий разрастается до тысяч строк не всегда хочется и резонно переходить на более серьёзную платформу. Впрочем, использовать AutoIt Plys не менее приятно и для коротких сценариев: использовать его крайне легко и прослойка максимально незаметна для пользователя.
В этом примере переменная bar и функция quux() приватные для модуля mylib.aup (их имена в объявлении заканчиваются звёздочкой) и невидимы в main.aup. Переменная foo и функция baz() будут видимы с префиксом mylib:
Sort — это синоним для _ArraySort, Split — это синоним для StringSplit, @NoCount — это синоним для $STR_NOCOUNT, “@” — это синоним для @CRLF, “.” — это синоним для оператора “&”.
/Rapid означает, что если исходные файлы не были изменены с предыдущего запуска, они не будут перетранслированы. Эта опция повышает скорость запуска сценария.
Опция /ErrorStdOut позволяет перенаправить сообщения о фатальных ошибках в StdOut, чтобы их можно было поймать приложением.
Также вы можете отключить обмен данными через стандартные потоки ввода/вывода, тогда процесс-обёртка не будет потреблять память, но тогда вы не сможете наблюдать вывод вашей программы в окне вывода вашей среды разработки. Это делается добавлением опции /NoStdio.
Если вы хотите перевести сценарий в чистый AutoIt-код, используйте
Попробуйте пакет AutoIt Plys для Sublime Text, который включает в себя подсветку синтаксиса, авто-дополнение, систему сборки для запуска и компиляции, контекстную справку, переход к определению, включение комментария по горячей клавише, команды Tidy и Include Helper для AutoIt и AutoIt Plys.
Вы можете скомпилировать сценарий, указав компилятору переведённый файл *.aup.au3.
Скачать
- директива препроцессора #import "filename" загружает только публичные функции и переменные
- блоки кода посредством отступов в стиле Python (без endfunc, wend и т. д.)
- dim и const вне функций означают global и global const соответственно, внутри функций означают local и local const
- аргументы функций по умолчанию являются константами, но со спецификатором dim становятся изменяемыми
- короткие синонимы для функций, которые как правило используются в крупных проектах: для массивов, файлов и строк
- имена переменных без префикса «$»
- однострочные анонимные функции
- и всё это опционально
#import
Когда сценарий разрастается до тысяч строк, его удобнее поддерживать, разбив на несколько файлов и подключая их через #include. В каждом таком файле окажутся свои функции, переменные, константы. По мере дальнейшего роста проекта таких файлов и функций становится десятки или даже сотни — возрастает вероятность, что имена из разных файлов будут совпадать и код из одного файла вмешается в работу другого. Для разрешения подобных коллизий к именам функций и переменных добавляются префиксы, уникальные для каждого файла.Минусы такого подхода: во-первых, пользователь всё равно может «выстрелить себе в ногу», случайно или намеренно используя функцию из другого файла по имени с заданным префиксом, во-вторых, код с префиксами становится громоздким, что сказывается на читаемости, а как известно, код чаще читается, чем пишется.
Эту проблему решает #import: во-первых, он, в отличие от #include, предоставляет доступ только к публичным именам подключаемого файла (отмечаются звёздочкой в конце имени при объявлении, например const Foo* = 42), во-вторых, в подключаемом файле префиксы больше не нужны — доступ к ним из другого файла всё равно будет запрещён, пока программист явно не разрешит.
EndFunc, WEnd…
Повторюсь: код чаще читается, чем пишется. Подобные «закрывашки» делают код громоздким. Наверняка вы видели бессмысленную и уродливую лесенку наподобие этой:В AutoIt Plys блоки кода определяются отступами и «закрывашки» являются необязательными. Но за отступами придётся последить. И это хорошо: код без отступов читать невозможно: и постороннему программисту, и вам, если вы давно не работали с проектом. И это несложно: любой адекватный текстовый редактор для программирования автоматически делает отступы.
dim/const
Области видимости переменных — это одна из ошибок в дизайне AutoIt. Сами авторы языка AutoIt в официальной справке предостерегают использовать dim, признают неотличимость local и global при объявлении переменных в глобальном пространстве, не рекомендуют использовать global внутри функций. Ну и, опять же, громоздкие local и global const не добавляют читаемости. В AutoIt Plys сделано проще: объявляешь вне функции — будет глобальной, объявляешь внутри — будет локальной. Просто dim для переменных и просто const для констант. Без local и без global.Константные аргументы функций
Константы — это удобно. Речь, конечно, про большие сценарии, в маленьких удобнее не объявлять переменные вообще. Многие значения в сценарии по логике реализуемого алгоритма должны быть неизменными, а явное указание их константами предостерегает от ошибок: если вы случайно или намеренно попытаетесь изменить величину, объявленную как константа, интерпретатор выдаст сообщение об ошибке и вы точно узнаете, что была попытка совершить операцию, противоречащую логике алгоритма. Если же всегда и без разбора использовать изменяемые переменные, такой помощи со стороны интерпретатора уже не будет.AutoIt Plys воспринимает аргументы функций по умолчанию как константы, преследуя вышеописанную цель: помочь пользователю в обнаружении ошибок. Да, в чистом AutoIt можно явно указать const перед именем аргумента, но об этом как правило забывают, да и, опять же, дополнительные префиксы не добавляют коду читаемости.
Обзор
Код:
; файл mylib.aup
dim foo*, bar
func baz*()
foo = quux()
func quux(dim arg="one/two/three")
bar = Sort(Split(arg, "/", @NoCount))
return "begin" . @ . bar[0] . @ . "end"
Код:
; файл main.aup
#import "mylib.aup"
…
В этом примере переменная bar и функция quux() приватные для модуля mylib.aup (их имена в объявлении заканчиваются звёздочкой) и невидимы в main.aup. Переменная foo и функция baz() будут видимы с префиксом mylib:
Код:
; файл main.aup
#import "mylib.aup"
foo = baz() ; ошибка: в этом пространстве foo и baz() не объявлены
mylib:foo = mylib:baz() ; порядок: foo baz() являются публичными в пространстве mylib
mylib:bar = mylib:quux() ; ошибка: bar и quux() являются приватными в пространстве mylib
Sort — это синоним для _ArraySort, Split — это синоним для StringSplit, @NoCount — это синоним для $STR_NOCOUNT, “@” — это синоним для @CRLF, “.” — это синоним для оператора “&”.
Add ColDelete ColInsert Combinations Display Extract FindAll Insert Max MaxIndex Min MinIndex Permute Pop Push Search Shuffle Sort Swap ToClip Transpose Trim Unique → _Array*
ToHist → _Array1DToHistogram
BinSearch → _ArrayBinarySearch
Concat → _ArrayConcatenate
ChangeDir Copy CreateShortcut Flush GetAttrib GetEncoding GetLongName GetShortcut GetShortName GetSize GetTime GetVersion Open Opendialog Read ReadLine ReadToArray Recycle RecycleEmpty SaveDialog SelectFolder SetAttrib SetEnd SetPos SetTime Write WriteLine → File*
CreateLink → FileCreateNTFSLink
FirstFile → FileFindFirstFile
NextFile → FileFindNextFile
Struct → DllStructCreate
StructGet → DllStructGetData
StructGetSize → DllStructGetSize
StructGetPtr → DllStructGetPtr
StructSet → DllStructSetData
Echo → ConsoleWrite
AddCR Format InStr IsAlNum IsAlpha IsASCII IsDigit IsLower IsSpace IsUpper IsXDigit Left Len Lower Mid Replace Right Split StripCR StripWS TrimLeft TrimRight Upper → String*
ReFind → StringRegExp
ReReplace → StringRegExpReplace
Activate Active Flash GetCaretPos GetClassList GetClientSize GetProcess GetTitle Kill List MenuSelectItem MinimizeAll MinimizeAllUndo SetOnTop SetTitle SetTrans Wait WaitActive WaitClose WaitNotActive → Win*
@ReMatch → $STR_REGEXPMATCH
@ReArray @ReArrayFull @reArrayGlobal @reArrayGlobalFull → $STR_REGEXP*MATCH
@NoCaseSense @CaseSense @NoCaseSenseBasic @StripLeading @StripTrailing @StripSpaces @StripAll @ChrSplit @EntireSplit @NoCount @EndNotStart @UTF16 @USC2 → $STR_*
@ → @CRLF
@ActiveWin → WinGetHandle("[ACTIVE]")
@CmdLine → $CmdLine
. → &
.= → &=
ToHist → _Array1DToHistogram
BinSearch → _ArrayBinarySearch
Concat → _ArrayConcatenate
ChangeDir Copy CreateShortcut Flush GetAttrib GetEncoding GetLongName GetShortcut GetShortName GetSize GetTime GetVersion Open Opendialog Read ReadLine ReadToArray Recycle RecycleEmpty SaveDialog SelectFolder SetAttrib SetEnd SetPos SetTime Write WriteLine → File*
CreateLink → FileCreateNTFSLink
FirstFile → FileFindFirstFile
NextFile → FileFindNextFile
Struct → DllStructCreate
StructGet → DllStructGetData
StructGetSize → DllStructGetSize
StructGetPtr → DllStructGetPtr
StructSet → DllStructSetData
Echo → ConsoleWrite
AddCR Format InStr IsAlNum IsAlpha IsASCII IsDigit IsLower IsSpace IsUpper IsXDigit Left Len Lower Mid Replace Right Split StripCR StripWS TrimLeft TrimRight Upper → String*
ReFind → StringRegExp
ReReplace → StringRegExpReplace
Activate Active Flash GetCaretPos GetClassList GetClientSize GetProcess GetTitle Kill List MenuSelectItem MinimizeAll MinimizeAllUndo SetOnTop SetTitle SetTrans Wait WaitActive WaitClose WaitNotActive → Win*
@ReMatch → $STR_REGEXPMATCH
@ReArray @ReArrayFull @reArrayGlobal @reArrayGlobalFull → $STR_REGEXP*MATCH
@NoCaseSense @CaseSense @NoCaseSenseBasic @StripLeading @StripTrailing @StripSpaces @StripAll @ChrSplit @EntireSplit @NoCount @EndNotStart @UTF16 @USC2 → $STR_*
@ → @CRLF
@ActiveWin → WinGetHandle("[ACTIVE]")
@CmdLine → $CmdLine
. → &
.= → &=
Установка
Требования: AutoIt (минимум), AutoIt Script Editor (опционально).- Скачайте и распакуйте архив из последнего выпуска.
- Дважды щёлкните по файлу setup.aup.au3 и следуйте инструкциям установки.
Первые шаги
- Щёлкните правой кнопкой в любой папке и выберите
New > AutoIt Plys Script
. - Щёлкните правой кнопкой по созданному файлу и выберите
Edit Script
. - В конце содержимого файла напечатайте следующее:
- Сохраните сценарий и щёлкните дважды по файлу для запуска (или щёлкните правой кнопкой по файлу и выберите Run Script).
Дополнительные опции
Вы можете использовать дополнительные опции, добавив в сценарий одну из следующих директив:
Код:
#plys dollarprefix ; запретить использование переменных без префикса «$»
#plys noconst ; использовать поведение по умолчанию для объявлений переменных
#plys noindent ; игнорировать отступы, но требовать использование endif, wend и т. п.
#plys noimport ; запретить оператор import
#plys nosynonyms ; запретить синонимы для функций и макро
#plys nolambda ; запретить анонимные функции
Окружение
После установки Plys уже будет встроен в оболочку Windows (запуск по двойному щелчку, контекстное меню). Если вы хотите запускать ваш сценарий через командную строку, используйте следующую команду<AutoIt3.exe path> <AutoIt3exe folder>\Plys\plys.aup.au3 [/Rapid] [/ErrorStdOut] [/NoStdio] <script path> [<arguments>]
/Rapid означает, что если исходные файлы не были изменены с предыдущего запуска, они не будут перетранслированы. Эта опция повышает скорость запуска сценария.
Опция /ErrorStdOut позволяет перенаправить сообщения о фатальных ошибках в StdOut, чтобы их можно было поймать приложением.
Также вы можете отключить обмен данными через стандартные потоки ввода/вывода, тогда процесс-обёртка не будет потреблять память, но тогда вы не сможете наблюдать вывод вашей программы в окне вывода вашей среды разработки. Это делается добавлением опции /NoStdio.
Если вы хотите перевести сценарий в чистый AutoIt-код, используйте
<AutoIt3.exe path> <AutoIt3exe folder>\Plys\plys.aup.au3 [/Translate] <script path>
Попробуйте пакет AutoIt Plys для Sublime Text, который включает в себя подсветку синтаксиса, авто-дополнение, систему сборки для запуска и компиляции, контекстную справку, переход к определению, включение комментария по горячей клавише, команды Tidy и Include Helper для AutoIt и AutoIt Plys.
Вы можете скомпилировать сценарий, указав компилятору переведённый файл *.aup.au3.
Как это работает
Файл plys.aup.au3 содержит код, который запускается сразу же при запуске вашего сценария. При установке этот файл копируется в папку с установленным AutoIt (как Plys\plys.aup.au3) и файлы *.aup ассоциируются с ним. Во время запуска aup-файлов они автоматически обрабатываются, после чего новый процесс AutoIt интерпретирует уже сконвертированный код, и текущий процесс остаётся в цикле для продолжения обмена данными с новым процессом посредством стандартных потоков. Этот обработчик заменяет все #import директивой #include. Обработанные файлы получают расширение .aup.au3 и помещаются в папку исходного сценария с атрибутом «скрытый».Будущее
- #import "filename.aup" noprefix
Код:
#import "mylib.aup" noprefix
bar = foo()
; bar и foo будут взяты из mylib.aup без префикса mylib:
- #import "filename.aup" as alias
Код:
#import "mylib.aup" as ml
ml:bar = ml:foo() ; bar и foo будут взяты из mylib.aup
- функции внутри функций
Код:
func GlobalFunc()
dim var1 = "body"
func LocalFunc(var2)
return "begin" . @ . var2 . @ . "end"
return LocalFunc(LocalFunc(var1))
MsgBox(MB_OK, "begin/body/end", GlobalFunc())
- значения-массивы «на месте»
Код:
a = [3, 7, 1]
for i in [1, 2, 4]
Echo(i . @)
Display([t*3 for t in a if t > i]) ; if i = 2 then Display([9, 21]) etc.
Скачать
- Источник
- Ссылка на источник
Последнее редактирование: