View Issue Details

IDProjectCategoryView StatusLast Update
0000768WishesMacropublic2009-03-06 10:34
ReporterJohnDoe Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionfixed 
Product Version1.75 
Fixed in Version1.75 
Summary0000768: Расширение параметров макрофункции eval() для проверки корректности макропоследовательности
DescriptionСказано:
>N=eval(S)
>Функция возвращает 0 в случае успешной компиляции последовательности S.

(1)
Чтобы проверить корректность S достаточно посмотреть на N
Но хотелось бы иметь возможность проверить корректность не выполняя саму S.
Для этого можно было бы довавить в функцию опциональный параметр:

N=eval(S[,T])
Если T=0x00000001, то макропоследовательность заданная строкой S не исполняется, а только проверяется на корректность.

(2)
Что собственно означает N? Номер символа на котором компилятор споткнулся?
TagsNo tags attached.
Build2539

Activities

vskirdin

2009-03-04 10:55

administrator   bugnote:0002684

> Что собственно означает N?
это некий счетчик ошибок (см. syntax.cpp::_macro_nErr)

vskirdin

2009-03-04 10:57

administrator   bugnote:0002685

кстати, да, можно добавить параметр.
причем безболезненно.
сделаю

zg

2009-03-04 11:29

developer   bugnote:0002686

вообще-то это вроде и сейчас можно сделать добавлением $if 0. не?

vskirdin

2009-03-04 11:35

administrator   bugnote:0002687

не, eval в онлайне компилирует - ей строка передается, а движок строки не парсит

JohnDoe

2009-03-04 11:49

updater   bugnote:0002688

Last edited: 2009-03-05 09:58

Вообще это мысль

$If(eval("$If(0) "+%m+" $Else $End")>0)
    msgbox("Error in macro",%m)
$End

vskirdin

2009-03-04 12:56

administrator   bugnote:0002689

> Вообще это мысль
закрываем тему? ;-)

JohnDoe

2009-03-04 13:03

updater   bugnote:0002690

Last edited: 2009-03-04 13:08

(1) Можно и закрыть (добавив про $If(0) в писание).
(2)
>> Что собственно означает N?
> это некий счетчик ошибок (см. syntax.cpp::_macro_nErr)

А нельзя ли возвращать номер символа, на котором встретилась первая ошибка?

vskirdin

2009-03-04 13:19

administrator   bugnote:0002691

> А нельзя ли возвращать номер символа, на котором встретилась первая ошибка?
А смысл?
Для многострочных (макросы можно хранить в REG_MULTISZ!) в какой строке ОНО произошло?

На счет проверки и диагностики.
Сейчас есть неопубликованный АПИ.
MCMD_CHECKMACRO возвращает 3 строки:
1. из lng от MMacroPErrUnrecognized_keyword до MMacroPErrExpr_Expected
2. часть макропоследовательности (кусок, вокруг ошибки)
3. символ '^' указывающий на "батву", обнаруженную компилятором

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

JohnDoe

2009-03-04 14:46

updater   bugnote:0002692

>А смысл?
Учитывая REG_MULTISZ выходит что смысла нет.
Но "некий счетчик ошибок" несёт смысла ещё меньше...

Насчёт кривизны АПИ судить не берусь (квалификации нет).
Но какое-то пусть и кривенькое средство отладки хотелось бы.

Что если eval() научить возвращать строку 1+2+3?

vskirdin

2009-03-04 14:47

administrator   bugnote:0002693

>> Что собственно означает N?
>это некий счетчик ошибок (см. syntax.cpp::_macro_nErr)
наврал я... ;-)
N - это код ошибки

enum errParseCode
{
  err_Success,
  err_Unrecognized_keyword,
  err_Unrecognized_function,
  err_Not_expected_ELSE,
  err_Not_expected_END,
  err_Unexpected_EOS,
  err_Expected,
  err_Bad_Hex_Control_Char,
  err_Bad_Control_Char,
  err_Var_Expected,
  err_Expr_Expected,
};

(надо в писание дописать...)

vskirdin

2009-03-04 15:30

administrator   bugnote:0002694

2.00 = 811
1.75 = 2537

JohnDoe

2009-03-05 08:45

updater   bugnote:0002705

2537

macro:post msgbox(eval("msgbox(1)",1))
не исполняется

macro:post msgbox(eval("msgbox(1)"))
в коммандную строку вставляется 0

vskirdin

2009-03-05 09:04

administrator   bugnote:0002706

блин... забыл в одном месте прописать....
будет в 2539

JohnDoe

2009-03-05 12:01

updater   bugnote:0002712

Можно добавить констант. Но это смотря как переведут http://api.farmanager.com/en/macro/macrocmd/functions.html

варианты:

REGEDIT4

[HKEY_CURRENT_USER\Software\Far\KeyMacros\Consts]

"EVAL_EXECUTE"=dword:00000000
"EVAL_RUN"=dword:00000000
"EVAL_PLAY"=dword:00000000

"EVAL_TEST"=dword:00000001
"EVAL_CHECK"=dword:00000001

vskirdin

2009-03-05 12:06

administrator   bugnote:0002714

все пять?
А коды возврата? (хотя, нужны ли они)

JohnDoe

2009-03-05 12:17

updater   bugnote:0002716

:-)
Не, только 2.
Но пока не перевели писание непонятно как точнее назвать константы.

А коды возврата можно было бы в стиле EVAL_err_Unrecognized_keyword,
но только вряд ли кто будет интенсивно пользоваться.

А если просто код возврата переводить в текст, то проще без констант.

$If(%n!=0)
       $If(%n==1) %err="err_Unrecognized_keyword"; $End
       $If(%n==2) %err="err_Unrecognized_function"; $End
       $If(%n==3) %err="err_Not_expected_ELSE"; $End
       $If(%n==4) %err="err_Not_expected_END"; $End
       $If(%n==5) %err="err_Unexpected_EOS"; $End
       $If(%n==6) %err="err_Expected"; $End
       $If(%n==7) %err="err_Bad_Hex_Control_Char"; $End
       $If(%n==8) %err="err_Bad_Control_Char"; $End
       $If(%n==9) %err="err_Var_Expected"; $End
       $If(%n==10) %err="err_Expr_Expected"; $End
$End

Issue History

Date Modified Username Field Change
2009-03-04 08:36 JohnDoe New Issue
2009-03-04 08:36 JohnDoe Status new => assigned
2009-03-04 08:36 JohnDoe Assigned To => vskirdin
2009-03-04 10:55 vskirdin Note Added: 0002684
2009-03-04 10:57 vskirdin Note Added: 0002685
2009-03-04 11:29 zg Note Added: 0002686
2009-03-04 11:35 vskirdin Note Added: 0002687
2009-03-04 11:49 JohnDoe Note Added: 0002688
2009-03-04 12:56 vskirdin Note Added: 0002689
2009-03-04 13:03 JohnDoe Note Added: 0002690
2009-03-04 13:08 JohnDoe Note Edited: 0002690
2009-03-04 13:19 vskirdin Note Added: 0002691
2009-03-04 14:46 JohnDoe Note Added: 0002692
2009-03-04 14:47 vskirdin Note Added: 0002693
2009-03-04 15:30 vskirdin Note Added: 0002694
2009-03-04 15:30 vskirdin Status assigned => feedback
2009-03-05 08:45 JohnDoe Note Added: 0002705
2009-03-05 09:04 vskirdin Note Added: 0002706
2009-03-05 09:58 JohnDoe Note Edited: 0002688
2009-03-05 12:01 JohnDoe Note Added: 0002712
2009-03-05 12:06 vskirdin Note Added: 0002714
2009-03-05 12:17 JohnDoe Note Added: 0002716
2009-03-06 08:27 JohnDoe Status feedback => resolved
2009-03-06 08:27 JohnDoe Resolution open => fixed
2009-03-06 10:34 vskirdin Build => 2539
2009-03-06 10:34 vskirdin Status resolved => closed
2009-03-06 10:34 vskirdin Fixed in Version => 1.75
2009-09-08 18:11 alexy Relationship added has duplicate 0001046
2009-09-08 19:02 vskirdin Relationship deleted has duplicate 0001046