Форум » [x]Harbour » оператор IN » Ответить

оператор IN

MIKHAIL: Подскажите как можно реализовать препроцессором конструкцию вида Var IN (id1,id2,....idN) что бы возвращала значения Var==Id1.or.Var==Id2.or.....Var==IdN Причем что бы в скобках оператора можно было использовать так же и массив значений

Ответов - 13

Pasha: Можно просто использовать ASCAN: ASCAN({id1,id2,....idN}, Var) # 0

MIKHAIL: Pasha пишет: ASCAN({id1,id2,....idN}, Var) # 0 тоже вариант, но хотелось бы транслировать препроцессором, так проще читается код, как работает препроцессор очень смутно понимаю )

Pasha: Вряд ли возможно препроцессором транслировать в конструкцию с .or. Можно написать функцию, которая бы принимала параметры и выдавала бы .or., и эту функцию вызывать средствами препроцессора. А зачем ее писать, если уже есть ascan ?


MIKHAIL: Pasha пишет: и эту функцию вызывать средствами препроцессора Да, именно это, хотелось бы научиться транслировать разные текстовые конструкции в функции и передавать ей параметры описанные по правилам, после ключевых слов параметры подставляются туда куда надо, особенно если у функции множество принимаемых параметров...

SergKis: MIKHAIL пишет Да, именно это, хотелось бы научиться транслировать см. MiniGu\Include\i_*.ch там много примеров. Такой [pre2] #translate MemVar . <AreaName> . <FieldName> => MemVar<AreaName><FieldName> /////////////////////////////////////////////////////////////////////////////// // STANDARD BROWSE /////////////////////////////////////////////////////////////////////////////// #command @ <row>,<col> BROWSE <name> ; [ ID <nId> ] ; [ <dummy1: OF,PARENT,DIALOG> <parent> ] ; [ WIDTH <w> ] ; [ HEIGHT <h> ] ; [ HEADERS <headers> ] ; [ WIDTHS <widths> ] ; [ WORKAREA <workarea> ] ; [ FIELDS <Fields> ] ; [ VALUE <value> ] ; [ FONT <fontname> ] ; [ SIZE <fontsize> ] ; [ <bold : BOLD> ] ; [ <italic : ITALIC> ] ; [ <underline : UNDERLINE> ] ; [ <strikeout : STRIKEOUT> ] ; [ TOOLTIP <tooltip> ] ; [ BACKCOLOR <backcolor> ] ; [ DYNAMICBACKCOLOR <dynamicbackcolor> ] ; [ DYNAMICFORECOLOR <dynamicforecolor> ] ; [ FONTCOLOR <fontcolor> ] ; [ ON GOTFOCUS <gotfocus> ] ; [ ON CHANGE <change> ] ; [ ON LOSTFOCUS <lostfocus> ] ; [ ON DBLCLICK <dblclick> ] ; [ <edit : EDIT> ] ; [ <inplace : INPLACE> ] ; [ <append : APPEND, ALLOWAPPEND> ] ; [ INPUTITEMS <inputitems> ] ; [ DISPLAYITEMS <displayitems> ] ; [ ON HEADCLICK <aHeadClick> ] ; [ <d2: WHEN, COLUMNWHEN> <aWhenFields> ]; [ <d3: VALID, COLUMNVALID> <aValidFields> ]; [ VALIDMESSAGES <aValidMessages> ] ; [ READONLY <aReadOnly> ] ; [ <lock: LOCK> ] ; [ <Delete: DELETE, ALLOWDELETE> ] ; [ <style: NOLINES> ] ; [ IMAGE <aImage> ] ; [ JUSTIFY <aJust> ] ; [ <novscroll: NOVSCROLL> ] ; [ HELPID <helpid> ] ; [ <break: BREAK> ] ; [ COLUMNSORT <columnsort> ] ; [ HEADERIMAGE <aImageHeader> ] ; [ <doublebuffer: PAINTDOUBLEBUFFER> ] ; [ <notabstop: NOTABSTOP> ] ; [ ON INIT <bInit> ] ; =>; _DefineBrowse ( <"name"> , ; <"parent"> , ; <col> , ; <row> , ; <w> , ; <h> , ; <headers> , ; <widths> , ; <Fields> , ; <value> , ; <fontname> , ; <fontsize> , ; <tooltip> , ; <{change}> , ; <{dblclick}> , ; <aHeadClick> , ; <{gotfocus}> , ; <{lostfocus}>, ; <"workarea"> , ; <.Delete.>, ; <.style.> , ; <aImage> , ; <aJust> , ; <helpid> , ; <.bold.> , ; <.italic.> , ; <.underline.> , ; <.strikeout.> , ; <.break.> , ; <backcolor> , ; <fontcolor> , ; <.lock.> , ; <.inplace.> , ; <.novscroll.> , ; <.append.> , ; <aReadOnly> , ; <aValidFields> , ; <aValidMessages> , ; <.edit.> , ; <dynamicforecolor> , ; <dynamicbackcolor> , ; <aWhenFields>, ; <nId>, ; <aImageHeader>, ; <.notabstop.> , ; <inputitems> , ; <displayitems> , ; <.doublebuffer.> , <columnsort> , <bInit> ) [/pre2]

Pasha: можно так: #translate <var> IN <values,...> => ASCAN({ <values> }, <var>) # 0 тогда конструкция if n1 IN 1,2,3 транслируется в оператор: if ASCAN({ 1,2,3 }, n1) # 0

SergKis: Можно чуть усилить, получая номер позиции сразу[pre2] #translate <var> IN <values,...> [ TO <var2> ] => ASCAN({<values>}, <var> ) # 0 ;; [ <var2> := ] ASCAN({<values>}, <var> ) тогда p := -1 b := 30 c := .F. a := {"111","222","333","444","555" } If b IN 10,20,30,40,50 c := .T. IF b IN 10,20,30,40,50 TO p ENDIF EndIf ? 'b =', c, p, iif( p > 0, a[ p ], "" ) [/pre2]

MIKHAIL: SergKis пишет: ? 'b =', c, p, iif( p > 0, a[ p ], "" ) Кстати, никогда не мог понять чем if() отличается от iif() ?

Dima: MIKHAIL пишет: Кстати, никогда не мог понять чем if() отличается от iif() ? это одно и тоже

SergKis: MIKHAIL пишет:Кстати, никогда не мог понять чем if() отличается от iif() ? Использую iif(...) по привычке и т.к. используемые редакторы подсвечивают if и не подсвечивают iif.

Pasha: Отключаю FarColorer, так как с ним редактор чуть подтормаживает, а это чуть некомфортно. Вбиваю if, так как на одну букву меньше вбивать. Тоже привычка

SergKis: Pasha пишет Отключаю FarColorer Тогда пропадает подсветка и возрастает нагрузка на глаза, надо выглядывать IF ... ELSEIF ... ... ENDIF и т.д. Akelpad, Notepad3 не тормозят с подсветкой, может, при большом тексте, hbedit подтормаживает чуть - это мелочь. IF .. IN ... можно расширить для массива и Hash[pre2] #xtranslate <var> INA <val> [ TO <var2> ] => iif( ISHASH( <val> ), hb_HPos( <val>, <var> ), ASCAN( <val>, <var> ) ) # 0 ;; [ <var2> := ] iif( ISHASH( <val> ), hb_HPos( <val>, <var> ), ASCAN( <val>, <var> ) ) [/pre2]

MIKHAIL: Pasha пишет: #translate <var> IN <values,...> [ TO <var2> ] => ASCAN({<values>}, <var> ) # 0 ;; [ <var2> := ] ASCAN({<values>}, <var> ) вступает в конфликт с for each, нужно добавить If #translate if <var> IN <values,...> => if ASCAN({<values>}, <var> ) # 0



полная версия страницы