Полезные подпрограммы и конвенции

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
HaRT
Moderator
Posts: 11359
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 260 times
Been thanked: 405 times

Полезные подпрограммы и конвенции

Post by HaRT »

В связи с появлением в макроязыке подпрограмм (см. PlayMacro) предлагаю вывешивать и обсуждать в данной теме полезные подпрограммы общего назначения. Заодно предлагаю вполне рабочую конвенцию передачи параметров, именования локальных переменных подпрограмм и возврата значений из функций.
Итак, %%Trim:

Code: Select all

%Trim_s = %_1;
%Trim_w = iif ( %_2 == "" || %_2 == 0, " \t\r\n\v", string ( %_2 ) );
%Trim_o = iif ( %_3 == "" || %_3 == 0, "LR", string ( %_3 ) );

%Trim_l = len ( %Trim_s );
$If ( index ( ucase ( %Trim_o ), "L" ) >= 0 )
  $While ( 0 <= index ( %Trim_w, substr ( %Trim_s, 0, 1 ) ) )
    %Trim_l = %Trim_l - 1; %Trim_s = substr ( %Trim_s, 1, %Trim_l );
  $End
$End
$If ( index ( ucase ( %Trim_o ), "R" ) >= 0 )
  $While ( 0 <= index ( %Trim_w, substr ( %Trim_s, %Trim_l - 1, 1 ) ) )
    %Trim_l = %Trim_l - 1; %Trim_s = substr ( %Trim_s, 0, %Trim_l );
  $End
$End
%_0 = %Trim_s;
Документация, надеюсь, не требуется. “Трансляцию” предлагаю осуществлять посредством FMM 0.2.
PS
Вот пример использования:

Code: Select all

%_1 = " \tOK \v"; %_3 = "R"; PlayMacro ( %%Trim ) $Text %_0
2008-08-04
Выложена исправленная версия.
User avatar
JlblC
Posts: 48
Joined: Wed 19 Oct, 2005 16:52

Post by JlblC »

хотелось чтоб это вызывалось

Code: Select all

PlayMacro(%%Trim,%txt," \tOK \v","R") $Text %txt
и %0 не стоит трогать ИМХО, а нумеровать параметры с 1
User avatar
HaRT
Moderator
Posts: 11359
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 260 times
Been thanked: 405 times

Post by HaRT »

JlblC wrote:и %0 не стоит трогать ИМХО, а нумеровать параметры с 1
Я так и делаю. Если Вы присмотритесь, то увидите, что %_0 я использую как возвращаемое значение. Кому хочется возвращать через параметры, тот может так и делать.

По поводу синтаксиса вызова: вообще-то PlayMacro не для этого предназначен. Да и нет (пока) в макроязыке переменного числа аргументов в функциях.
User avatar
HaRT
Moderator
Posts: 11359
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 260 times
Been thanked: 405 times

Как определить текущую букву/ цифру в меню дисков

Post by HaRT »

Навеяно Запросом №160 (кто не знает, про вход написано тут).
Итак, %%GetCurDrvChar

Code: Select all

%_0 = "";
$If ( Disks )
  %abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789";
  %GetCurDrvChar_p = CurPos;
  Home
  %GetCurDrvChar_i = 0;

  $While ( CurPos <= %GetCurDrvChar_p && %GetCurDrvChar_c != "" )
    %GetCurDrvChar_c = substr ( %abc, %GetCurDrvChar_i, 1 );
    $If ( CheckHotkey ( %GetCurDrvChar_c ) )
      %GetCurDrvChar_l = %GetCurDrvChar_c;
      Down
    $End
    %GetCurDrvChar_i = %GetCurDrvChar_i + 1;
  $End

  $If ( %GetCurDrvChar_c == "" )
    %GetCurDrvChar_c = %GetCurDrvChar_l;
  $End

  Home
  $While ( CurPos < %GetCurDrvChar_p )
    Down
  $End

  %_0 = %GetCurDrvChar_c;
$End
HaRT wrote:“Трансляцию” предлагаю осуществлять посредством FMM 0.2.
Вот пример использования (Far b.2228 и новее):

Code: Select all

eval ( %%GetCurDrvChar ) MsgBox ( %_0, "", 0 )
2007-09-04
После появления функции GetHotKey этот код представляет лишь академический интерес.
User avatar
Alexey Samlyukov
Posts: 1765
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 7 times
Contact:

Re: Как определить текущую букву/ цифру в меню дисков

Post by Alexey Samlyukov »

HaRT wrote: ... (кто не знает, про вход написано тут)
как мне сказал AY - "тут" теперь не требуется, т.к. мантис находится в общем доступе.
User avatar
HaRT
Moderator
Posts: 11359
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 260 times
Been thanked: 405 times

Как узнать номер строки в окне редактора

Post by HaRT »

%%GetEditorLine:

Code: Select all

$If ( ! Editor )
  %_0 = 0;
$Else
  %cur = Editor.CurLine; CtrlN %top = Editor.CurLine;
  $While ( Editor.CurLine < %cur )
    Down
  $End
  %_0 = %cur - %top + 1;
$End 
Пример использования:

Code: Select all

eval ( %%GetEditorLine )
MsgBox ( "", %_0 ) 
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
HaRT
Moderator
Posts: 11359
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 260 times
Been thanked: 405 times

Re: Полезные подпрограммы и конвенции

Post by HaRT »

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

Code: Select all

%Trim_s = %_1;
%Trim_w = iif ( %_2 == "" || %_2 == 0, " \t\r\n\v", string ( %_2 ) );
%Trim_o = iif ( %_3 == "" || %_3 == 0, "LR", string ( %_3 ) );

%Trim_l = len ( %Trim_s );
$If ( 0 <= index ( ucase ( %Trim_o ), "L" ) )
  $While ( 0 < %Trim_l && 0 <= index ( %Trim_w, substr ( %Trim_s, 0, 1 ) ) )
    %Trim_l = %Trim_l - 1; %Trim_s = substr ( %Trim_s, 1, %Trim_l );
  $End
$End
$If ( 0 <= index ( ucase ( %Trim_o ), "R" ) )
  $While ( 0 < %Trim_l && 0 <= index ( %Trim_w, substr ( %Trim_s, %Trim_l - 1, 1 ) ) )
    %Trim_l = %Trim_l - 1; %Trim_s = iif ( %Trim_l, substr ( %Trim_s, 0, %Trim_l ), "" );
  $End
$End

%_3 = ""; %_2 = ""; %_1 = "";
%_0 = %Trim_s; 
Вот пример использования:

Code: Select all

%_1 = " \tOK \v"; %_3 = "R"; eval ( %%Trim ) $Text %_0
PS
Из-за того, что для 3-его параметра функции substr значение 0 с некоторого момента приобрело особый смысл, приходится его перепроверять. Интересно, легко ли было использовать не 0, а -1?!

PPS
“Трансляцию” кода предлагаю осуществлять посредством FMM 0.4.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 14411
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 83 times
Been thanked: 484 times
Contact:

Альтернативные конвенции касательно реализации макро-подпрог

Post by John Doe »

HaRT wrote:В связи с появлением в макроязыке подпрограмм (см. PlayMacro)
Той темы уже не существует, ровно как и функции PlayMacro, на смену которой пришла eval.

Что касается подхода типа "документация не требуется" - то он хорош только если пишешь для личного пользования
(да и то через время бывает трудно понять что сам наворотил)


Предложения по титульному посту топика
Все кто бывал на форуме ru-board наверно обратили внимание на замечательную особенность: первый пост темы как правило сделан "шапкой" - повторяется на каждой странице, аккумулирует содержание топика, содержит перекрёстные ссылки на связанные темы...
Вот и на нашем форуме неплохо бы поддержать такую традицию.

В частности сабжевая тема заслуживает иметь титульный пост, в котором идея использования подпрограмм в макросах будет описана так, чтобы и новичок мог что-то почерпнуть.
"Конвенции" стоит описать явно. Там же упомянуть о трансляции с помощью FMM (и других утилит), и не повторять потом это в каждом новом сообщении.

2 HaRT: Вполне можно убрать из первого поста старую версию Trim и сделать титульный пост действительно титульным.


Замечания к конвенциям
Поддерживаю конвенцию именования локальных переменных с префиксом, соответствующим названию подпрограммы
(на примере подпрограммы Trim - префикс %Trim_)
Но категорически против однобуквенных переменных типа %Trim_s, %Trim_w, %Trim_o, %Trim_l: краткость не должна идти в ущерб понятности
На мой взгляд допустимы разве что однобуквенные переменные-итераторы (i,j = %Trim_i, %Trim_j)

Чтобы отличать в реестре подпрограммы от обычных глобальных переменных предлагаю использовать для подпрограмм префикс %%Sub_:
%%Sub_Trim

Результат подпрограммы красивее возвращать не в %_0, а в одноимённый параметр
(если подпрограмма %%Sub_Trim, то возвращаемое значение - в переменной %Trim)

Что касается параметров, то вместо %_1 %_2 %_3 предлагаю использовать %Trim_1 %Trim_2 %Trim_3.
Врочем, какой смысл класть основу наименований передаваемых параметров "позиционность" которой на самом деле нет?
Я лично использовал бы что-то осмысленное вместо _1 _2 _3.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14411
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 83 times
Been thanked: 484 times
Contact:

Re: Полезные подпрограммы и конвенции

Post by John Doe »

HaRT wrote:Никто ж не мешает Вам завести отдельную тему про альтернативные конвенции и поддерживать её в должном состоянии
Да тут и в одну тему никто не пишет (включая её автора), куда уж вторую заводить...
https://t.me/FarManager — Telegram чат
User avatar
HaRT
Moderator
Posts: 11359
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 260 times
Been thanked: 405 times

Re: Полезные подпрограммы и конвенции

Post by HaRT »

Про параметры и возвращаемое значение: вместо %_0, %_1, … с тем же успехом можно использовать %0, %1, …
Фар есть инструмент, а не нянька. © 2009 DrKnS
Post Reply

Return to “Обсуждение макросов”