1

Тема: AutoHotkey: проект перевода, ветка #2

продолжение, начало здесь: AutoHotkey: проект перевода

2

Re: AutoHotkey: проект перевода, ветка #2

NikVasKo
Да, с терминами в литературе действительно полный бардак. Принимать ли за истину в последнем стакане Кернигана и Ритчи в переводе Штаркмана - тоже вопрос спорный . Если справка AutoHotkey от этой "истины" отходит, то и нам, имхо, придётся отойти, т.к. мы всего лишь делаем перевод. На самом деле все мои рассуждения про операторы были просто "к слову", чтобы обосновать моё видение "multi-statement expression". Думаю, что лично мне интересна в данном случае не столько "истина", сколько мнения участников нашего русского AutoHotkey-community . Вобщем, ждём ещё мнений...

Кажется, можно безобидно приравнять Инструкция=Команда=Директива. Или нельзя?

Имхо, нельзя. В справке AutoHotkey слово "Инструкция" вроде вообще не применяется, а вот директивами называются особые команды, начинающиеся с шарпа (#). Т.е. все эти слова в AutoHotkey не совсем синонимы.

P.S. Думаю, прикреплять темы по AutoHotkey специально пока не надо - они и так неплохо держатся на плаву.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3 (изменено: NikVasKo, 2007-02-07 19:14:55)

Re: AutoHotkey: проект перевода, ветка #2

Я дублирую последнее сообщение с предыдущей ветки.

Разноголосица в обсуждаемых терминах полная и англо- и в русскоязычной литературе.

Вчера перелистал три книжки по Си. Во всех несколько туманно, но:
Операция=это + =>, и т.д
Оператор=If-else и т.д

Сегодня (рассерженно!) открыл классику: Керниган и Ритчи, Язык Си, в переводе Штаркмана, СПб.,2001.
Там со ссылкой на стандарт, утвержденный ANSI, "Аmerican National Standard for Information Systems - Programming Language C. X3.159-1989", можно найти следующее (привожу с  сокращениями, в силу избыточности оригинала).
===========================
Лексемы(или токены)=Идентификаторы|Ключевые слова|Константы|Строковые литералы|Операторы|Разделители
Константы=Целые|С плавающей точкой|Символьные|Перечисления
Символьные константы=Новая строка(NL)|Возврат каретки(CR)|Возврат нашаг(BS)|Обратная наклонная черта(\)|...
Объект=Именованная область памяти=Lvalue
Выражение=комбинация переменных, констант, операторов, возвращающая значение
Первичное выражение=Идентификатор|Константа|Строка|Выражение в скобках
Оператор=Арифметический|Отношения|Логический|Инкремента|Декремента|Побитовые|Присваивания|Запятая
Оператор=Унарный|Бинарный|Тернарный
Оператор унарный=Постфиксный|Префиксный
Инструкция=Инструкция помеченная|Инструкция-выражение|Инструкция составная=блок|Инструкция выбора|Инструкция циклическая|Инструкция перехода
====================
Предлагается это принять за истину (по возможности, без обсуждений, поскольку это классика).
Теперь мои домыслы:
Кажется, можно безобидно приравнять Инструкция=Команда=Директива. Или нельзя?
Считать, что оператор производит операцию над первичным выражением (=операнду), унарный над одним, бинарный над двумя...
Итогом операции является опять выражение.
Если значение выражения не используется, то это выражение-инструкция.
Знак операции и оператор - синонимы ли? Скобочные операторы и  ?: вроде бы состоят из двух знаков?

Идея - принять после обсуждения настоящее за основу сайтового словаря, который потихоньку дополнять всякими "консенсусами", и ПРИДЕРЖИВАТЬСЯ его в переводах.

Налетайте !

ЗЫ. Для Кардинала: Ничего сомнительного в том, что Оператор лежит внутри Оператора, я бы не увидел. Ведь может быть одно выражение внутри другого...

4

Re: AutoHotkey: проект перевода, ветка #2

NikVasKo
Please, запости сюда правильный вариант вот этого фрагмента (статья Регулярные выражения (RegEx) - краткий справочник):

Запросы вперед и назад: выражения (?=...), (?!...), (?<=...), и (?<!...), в которых на месте многоточия размещается любой шаблон, назовем запросами (assertion). Они только запрашивают выполнение некоторого условия, но сами не отвечают каким-либо символам. Например, abc(?=.*xyz) является запросом вперед, проверяющим, существует ли где-либо строка xyz, лежащая правее строки abc (если не существует, то весь шаблон считается не соответствующим). Конструкцию (?=...) называют позитивным запросом вперед, поскольку он требует, чтобы указанный шаблон НЕ находил соответствие впереди. Наоборот, (?!...) есть негативный запрос вперед, поскольку он требует, чтобы указанный шаблон находил соответствие впереди. Подобным же образом, (?<=...) и (?<!...) представляют соответственно позитивный и негативный запросы назад, поскольку они требуют, чтобы указанный шаблон проверял соответствие слева от текущей позиции. Запросы назад более ограничены в возможностях, чем запросы вперед, поскольку не поддерживают кванторы переменного размера *, ?, и +.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5

Re: AutoHotkey: проект перевода, ветка #2

NikVasKo
Ещё вопрос. В статье Переменные и выражения ты хотел добавить такой комментарий:

Автоматическое повышение старшинства операции привоения может приводить к странным фокусам. Так AutoHotKey обрабатывает следующие выражения:
x++     := 2 ; x=3
x++++   := 2 ; x=5
x++++++ := 2 ; x=6
++x     := 2 ; x=3
++++x   := 2 ; x=4
++x++   := 2 ; x=3
++x--   := 2 ; x=1
--x++   := 2 ; x=3
++x--   := 2 ; x=1
++++x-- := 2 ; x=1
++++x   := 2 ; x=4
+++x    := 2 ; x=3
--x     := 2 ; x=1
x--     := 2 ; x=1
x--+    := 2 ; x=0

У меня из этого работает далеко не всё. Во многих случаях вместо указанного тобой в комментарии числа получается пустое значение. Последняя строка вообще непонятна - какой смысл может иметь одинокий плюсик перед оператором (или операцией) присваивания? v1.0.46.07.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

6

Re: AutoHotkey: проект перевода, ветка #2

Я хотел приведенными примерами показать, что нововведение с изменением приоритета операций сомнительно: более-менее сложных случаях, осмысленные выражения не просчитываются, а бесмысленные считаются. Взаимонепонимание с Кардиналом от того, что дейстивельность хитрее, чем я думал некоторые из операций не только выпоняются с ошибкой, но и вообше не изменяют операнд. Вот еще несколько примеров с комментариями:

++x      := 2 ;x=3 здесь префикс работает
x++      := 2 ;x=3 здесь постфикс работает
++--x    := 2 ;x=2 здесь префиксы работают
x++++    := 2 ;  Этот оператор вовсе не меняет X
x++--    := 2 ;  Этот оператор вовсе не меняет X
x++-     := 2 ;  Этот оператор не меняет X, будучи бессмысленным
++x++    := 2 ;x=3 | Префиксная инкрементация игнорируется
--x++    := 2 ;x=3 |
++x--    := 2 ;x=1 |
++++x    := 2 ;х=4  Это работает
++++++x  := 2 ;x=5  Это работает
++++x++  := 2 ;x=3  А это уже бред
++x++++  := 2 ;x=4

7

Re: AutoHotkey: проект перевода, ветка #2

О регулярных выражениях. Пассаж надо понимать так:
======
Проверки впереди и позади: скобочные блоки (?=...), (?!...), (?<=...), и (?<!...), в которых на месте многоточия размещается любой шаблон, назовем проверками (assertion). Они только проверяют выполнение некоторого условия, но сами не отвечают каким-либо символам. Например, abc(?=.*xyz) является проверкой существования ли где-либо впереди (правее) строки abc строки xyz (если не существует, то весь текущий блок считается не отвечающим). Блок (?=...) будем называть "проверкой наличия впереди", поскольку он требует, чтобы указанный шаблон находил соответствие впереди. Наоборот, блок (?!...) есть "проверка отсутствия впереди", поскольку он требует, чтобы указанный шаблон НЕ находил соответствия впереди. Подобным же образом, (?<=...) и (?<!...) представляют соответственно "проверки наличия\отсутствия позади", поскольку они требуют, чтобы указанный шаблон проверял соответствие слева от текущей позиции. "Проверки сзади" более ограничены в возможностях, чем "проверки впереди", поскольку не поддерживают кванторы переменного размера *, ?, и +.

8

Re: AutoHotkey: проект перевода, ветка #2

NikVasKo
По поводу "автоматического изменения приоритета операций". Имхо, часть приведенных тобой фрагментов не работает не столько из-за путаницы с приоритетами операций, сколько из-за того, что AutoHotkey не всегда в состоянии правильно отработать множественные инкременты-декременты. Например, вот такое приводит к пустому x:

x++++ := 2

А вот такое приводит к x, равному 3, что тоже вроде бы неожиданно (хотелось 4):

x := 2
x++++

Исходя из этого, имхо, лучше вообще не заморачиваться с этим комментарием в статье.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

9

Re: AutoHotkey: проект перевода, ветка #2

Я исправил путаницу с негативными и позитивными запросами в статье Регулярные выражения (RegEx) - краткий справочник ("Запросы вперед и назад" в конце). В статье Переменные и выражения заменил "многооператорные выражения" на "составные выражения".

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

10

Re: AutoHotkey: проект перевода, ветка #2

Берусь за оставшиеся статьи из Window Management:

WinMinimize
WinMinimizeAll / WinMinimizeAllUndo
WinMove
WinRestore
WinSet
WinSetTitle
WinShow
WinWait
WinWaitActive / WinWaitNotActive
WinWaitClose

11

Re: AutoHotkey: проект перевода, ветка #2

Вечером собираюсь опубликовать оставшиеся 10 статей из раздела Window Management. Теперь мы имеем этот раздел перевёденным полностью, что очень хорошо, т.к. работа с окошками - один из "коньков" AutoHotkey.
YMP'у объявляется благодарность с занесением в личное дело, также он назначается заслуженным переводчиком script-coding.com и народным переводчиком AutoHotkey . На счету YMP'а 62 (шестьдесят две) статьи.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

12

Re: AutoHotkey: проект перевода, ветка #2

Спасибо за высокую оценку моих скромных трудов.
После таких приятных слов я сразу ощутил, что ещё не все силы отдал на благо AutoHotkey. Но есть одно обстоятельство, которое мешает мне со спокойной душой лечь на алтарь. Как я понял, на нас надвигается AutoHotkey v2. Говорят, там будет реформа синтаксиса, что сделает его несовместимым со старыми скриптами. В общем, точно я не знаю, конечно, что там будет по-другому и насколько, и когда именно это знаменательное событие на нас окончательно надвинется. Может, и не скоро. Но всё-таки. Чем больше я сейчас переведу, тем больше потом исправлять. Что-то мне не нравится такая перспектива, так что я, пожалуй, возьму пока тайм-аут до прояснения обстановки.

13

Re: AutoHotkey: проект перевода, ветка #2

YMP пишет:

на нас надвигается AutoHotkey v2

Это ещё, как говорят, писями по воде вилено. В бесплатных проектах "надвигание" новых версий может растянуться очень и очень надолго.

YMP пишет:

Чем больше я сейчас переведу, тем больше потом исправлять.

А вот это вообще в корне не верно . Что значит "исправлять"? Если v2 полностью поменяет язык, то просто придётся переводить ещё одну документацию (что никак не будет умалять достоинства уже переведенной документации по v1). По-любому уже переведенная документация по v1 всегда будет большим подспорьем для пользователей, т.к. какая-то преемственность версий будет обязательно. Так что непреходящая ценность того, чем мы сейчас занимаемся, никакому сомнению не подлежит.

Впрочем, тайм-ауты у нас не запрещены . Главное, чтобы работа была в удовольствие .

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

14

Re: AutoHotkey: проект перевода, ветка #2

The gray Cardinal
Посмотрел сейчас новую русскую chm-справку по AutoHotkey и вот что подумал. Там есть описания команд, которые отображаются в виде папок, т.к. в них имеются вложенные статьи. Запросто человек может проскочить мимо этих описаний. Не каждый ведь сообразит, что папка в этих случаях не просто контейнер, а тоже статья. Мне кажется, вложенные статьи вполне можно бы положить на тот же уровень, что и основные, - что в этом плохого? Да, в оригинале не так, но ведь криминала тут нет. Как ты думаешь?
Или сделать так, чтобы основная статья тоже в этой папке лежала вместе с дополнительными?

Что касается продолжения перевода, то я, пожалуй, с тобой соглашусь. Второй версии можно прождать неизвестно сколько.
Так что на очереди раздел Process Management:
Exit
ExitApp
OnExit
Process
Run / RunWait
RunAs
Shutdown
Sleep

15

Re: AutoHotkey: проект перевода, ветка #2

YMP
Думаю, проскочить мимо статей-папок в CHM довольно трудно, т.к. даже при одинарном щелчке по такой папке статья сразу же отображается. Да и вобщем-то повесить статью на папку в содержании - для CHM норма, по-моему. Вообще, я просто повторил структуру статей, как она выглядит на страничке проекта перевода, имхо, так вполне удобно.

Насчет Process Management - отлично. Качни на всякий случай последнюю версию - вдруг чего поменялось.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

16

Re: AutoHotkey: проект перевода, ветка #2

Проскочить можно, если щёлкать по плюсу, а не по папке. Я так и делаю в таких справках. На самих папках часто только ссылки на вложенные в них страницы, а зачем мне эти ссылки, если есть дерево? Вот я по папкам и не щёлкаю.

17

Re: AutoHotkey: проект перевода, ветка #2

Хочу, чтобы ещё кто-нибудь высказался по этому вопросу (папки в CHM).

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

18

Re: AutoHotkey: проект перевода, ветка #2

Меня текущий вид не напрягает. Но не напряжет и если, например, статьи висящие на папке, будут вложены в эту папку в виде таки статьи. А папка пусть будет просто контейнером. Может так даже и правильнее. Во всяком случае, так ИМХО было бы логичнее.

Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).

19

Re: AutoHotkey: проект перевода, ветка #2

Если затронуть логику, то вот, например, статейка о последнем найденном окне. Там говорится о вещах, которые касаются всех оконных команд. Только логично будет, если положить её на один уровень с ними. Что касается Post/SendMessage и двух вложенных, то они образуют группу и их логично сунуть в одну папку.

Если бы "родительские" страницы показывались в дереве в виде страниц, то и проблемы бы никакой не было. Именно отображение в виде папки имеет некоторую вероятность сбить с толку.

20

Re: AutoHotkey: проект перевода, ветка #2

Ну так и я об этом же.

Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).

21

Re: AutoHotkey: проект перевода, ветка #2

Понял. Посмотрю, что можно сделать.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

22

Re: AutoHotkey: проект перевода, ветка #2

Заменил файл. Распрямил иерархию, просто положил дочерние статьи под родителей. Отображать узлы дерева в виде статей, а не папок, насколько я понял, нельзя.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

23

Re: AutoHotkey: проект перевода, ветка #2

Предлагаю коллективно перевести комментарии к Примеру №4 в статье Process, т.к. там попадается специфическая терминология.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

24

Re: AutoHotkey: проект перевода, ветка #2

Вариант от Gourmet:

d = `n ; разделитель строк
s := 4096 ; размер буферов и массивов (4 KB)

Process, Exist ; Устанавливает значение перем. ErrorLevel равным идентификатору процесса текущего скрипта
; Получает дескриптор (handle) этого скрипта через PROCESS_QUERY_INFORMATION (0x0400)
h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel)
; Открывает регулируемый маркер доступа (adjustable access token) этого процесса
; (TOKEN_ADJUST_PRIVILEGES = 32)
DllCall("Advapi32.dll\OpenProcessToken", "UInt", h, "UInt", 32, "UIntP", t)
VarSetCapacity(ti, 16, 0) ; структура полномочий
InsertInteger(1, ti, 0, 4) ; один элемент в массиве полномочий...
; Извлекает локальный уникальный идентификатор полномочий на отладку:
DllCall("Advapi32.dll\LookupPrivilegeValueA", "UInt", 0, "Str", "SeDebugPrivilege", "UIntP", luid)
InsertInteger(luid, ti, 4, 8)
InsertInteger(2, ti, 12, 4) ; включает это полномочие: SE_PRIVILEGE_ENABLED = 2
; Обновляет полномочия этого процесса новым маркером доступа:
DllCall("Advapi32.dll\AdjustTokenPrivileges"
, "UInt", t, "Int", false, "UInt", &ti, "UInt", 0, "UInt", 0, "UInt", 0)
DllCall("CloseHandle", "UInt", h) ; закрывает данный дескриптор процесса для экономии памяти

; увеличиваем производительность, предварительно загружая библиотеку:
hModule := DllCall("LoadLibrary", "Str", "Psapi.dll")
s := VarSetCapacity(a, s) ; массив, который получает список идентификаторов процессов
DllCall("Psapi.dll\EnumProcesses", "UInt", &a, "UInt", s, "UIntP", r)
Loop, % r // 4 ; производим разбор массива для таких идентификаторов, как DWORDs (32 bits):
{
   id := ExtractInteger(a, A_Index * 4)
   ; Открываем процесс с помощью: PROCESS_VM_READ (0x0010) | PROCESS_QUERY_INFORMATION (0x0400)
   h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id)
   VarSetCapacity(m, s) ; массив, который получает список дескрипторов модулей:
   DllCall("Psapi.dll\EnumProcessModules", "UInt", h, "UInt", &m, "UInt", s, "UIntP", r)
   VarSetCapacity(n, s, 0) ; буфер, который получает базовое имя модуля:
   e := DllCall("Psapi.dll\GetModuleBaseNameA", "UInt", h, "UInt", m, "Str", n, "Chr", s)
   DllCall("CloseHandle", "UInt", h) ; закрываем дескриптор процесса для экономии памяти
   If n ; если образ не null, добавляем в список:
      l = %l%%n%%d%
}
DllCall("FreeLibrary", "UInt", hModule) ; выгружаем библиотеку, чтобы освободить память
; стираем первый и последний пункт списка (возможно, сигнатуры ASCII)
StringMid, l, l, InStr(l, d) + 1, InStr(l, d, false, 0) - 2 - InStr(l, d)
StringReplace, l, l, %d%, %d%, UseErrorLevel ; извлекаем число процессов
;Sort, l, C ; уберите комментарий с этой строки, чтобы отсортировать список в алфавитном порядке
MsgBox, 0, %ErrorLevel% процессов, %l%

ExtractInteger(ByRef pSource, pOffset = 0, pIsSigned = false, pSize = 4) ; см. описание DllCall
{
    Loop %pSize% ; собираем целое число, складывая его байты.
        result += *(&pSource + pOffset + A_Index-1) << 8*(A_Index-1)
    if (!pIsSigned OR pSize > 4 OR result < 0x80000000)
        return result ; в этих случаях не имеет значения, со знаком число или без
    return -(0xFFFFFFFF - result + 1)
}

InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4)
{
    Loop %pSize% ; копируем каждый байт целого числа в структуру как сырые двоичные данные
        DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1
        , "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF)
}
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

25

Re: AutoHotkey: проект перевода, ветка #2

По смыслу-то наверняка правильно. Но вот насколько это согласуется с принятой "в литературе" терминологией - вот что меня удержало от перевода. Тут бы как раз The gray Cardinal'у сказать веское слово, раз уж он всё время выступает в её (литературы) защиту от всяких там "контролов" и прочей отсебятины.