Страница 1 из 1

Использую Рефал в Галактике:)

Добавлено: 15 ноя 2010, 22:06
sensoft
Пример vip интерфейса к интерпретатору Рефал-5: http://sites.google.com/site/svobodnyef ... 0101115.7z
с решением задачки пакетной обработки Memo полей (106) таблиц.

Руководство по программированию и справочник Турчин В.Ф.: http://www.refal.ru/rf5_frm.htm - страница загрузки: http://botik.ru/pub/local/scp/refal5/refal5.html и загрузка версии PZ (Переславль Залесский): ftp://ftp.botik.ru/pub/local/scp/refal5 ... _winNT.zip

Re: Использую Рефал в Галактике:)

Добавлено: 15 ноя 2010, 22:19
sensoft
начальный вид:
Изображение
в табличной форме список таблиц с Memo полем, в анкетной - интерфейс к интерпретатору, в текстовой - содержание Memo поля

в поле Рефал проги - название файла с расширением .ref. В Rev.ref - простой пример с переворотом строк, редактируется по кнопке [ProcessText]:
Изображение
и компилируется по кнопке [RefC]

в поле входного файла для обработки - input.txt - текстовой файл, загружается по кнопке [ImportFileToMemo]:
Изображение
далее он передаётся интерпретатору в - output.txt по кнопке [ExportMemoToFile] и интерпретируется в файл - input.txt по кнопке [RefGo], из текста Rev.ref ясно, что Arg1 = output.txt, а Arg2 = input.txt

и наконец, загружаем результат обработки снова по кнопке [ImportFileToMemo]:
Изображение

при снятом checkbox [commit] результат виден только в текущем буфере, по двойному клику на таблице откроется окно:
Изображение
и если уйти с текущей записи и вернуться, то прежнее содержимое Memo поля восстановится

это видно и если открыть просмотр таблицы по кнопке [SF_ViewTable]:
Изображение
продолжение следует:)

Re: Использую Рефал в Галактике:)

Добавлено: 16 ноя 2010, 05:18
sensoft
Пример подстановок по таблице.

Рассмотрим задачу расширения списка рабочих таблиц с Memo полем в vip коде основного интерфейса:

Код: Выделить всё

! Корм для Рефала
!
!
!
! 26.11.2010 CEH
const
cfpSDIWindow=1054;ColorMark=19;sci178InsPM=6959;cmSelectAll=1219;cmUnSelectAll=1220;cmMarkUnMark=1221;cmInvertAll=1222;ftLVar=14;cmProcessText=3000;cmRefC=3001;cmRefGo=3002;cmRefTr=3003;cmSF_ViewTable=3004;cmImportFileToMemo=3005;cmExportMemoToFile=3006;
cmCompressLevel=3035;cmShowAll=3036;cmHideAll=3106;
end;

table struct mTbl ""
(
  nTbl : string[21]    "Имя таблицы",
  nFld : string[21]    "Имя Memo поля",
  nNrec: string[21]    "Имя Nrec поля",
  nT   : byte          "№ п/а таблицы"
)
with index
(
  byNTbl = nTbl
);
!----------------------------------------------------------------------------
interface MemoTbl '' ('',,scInterface) EscClose, Cyan;
create view as select X$FIELDS.XE$NAME, XF$NAME, xf.XE$NAME, mTbl.*
  from X$FIELDS, X$FILES, synonym X$FIELDS xf, mTbl
  where((
    root == X$FIELDS.XE$CODE and (byte(14) = X$FIELDS.XE$DATATYPE) and
    X$FIELDS.XE$FILECODE == XF$CODE and
    X$FIELDS.XE$FILECODE == xf.XE$FILECODE and
            word(ftLVar) == xf.XE$CODE and
    XF$NAME     == nTbl
  ));
handleEvent
  cmInit:   begin
    if( getFirst X$FIELDS = 0 )
      do {
        nTbl:=XF$NAME; nFld:=X$FIELDS.XE$NAME; nNrec:=xf.XE$NAME;
        if( insert current mTbl = 0 ) {};
      } while getNext X$FIELDS = 0;
    abort;
  end;
end;
end.
!----------------------------------------------------------------------------
interface Ref5 'refc+refgo' ('компиляции компиляции компиляции ... :)',,scInterface) EscClose, Cyan;
  show at (0,0,64,24);

var
  iDict,cI:byte;

  n:array [0..127] of comp;
  nI,m:array [1..127] of byte;
  ref5Prog,inTxtFile,outTxtFile,refGoModulParams,refGoArgParams,refGoArgParams2:string;
  batch,commit:word;

  MarkerNT,IndexNT:longint;

  Marker_ALGCALC,Index_ALGCALC:longint;
  Marker_ALGCALCTMPL,Index_ALGCALCTMPL:longint;

function selectMarker(x:byte):longint;
begin
  selectMarker:=bcase(x=0:0
    ,x=1:Marker_ALGCALC
    ,x=2:Marker_ALGCALCTMPL
  );
end;

create view as
  select nI[nT](FieldName=nInT)
    ,if(SearchMarker(MarkerNT,mTbl.nT,IndexNT),'+',' ')(FieldName=picked)
    ,GetMarkerCount(selectMarker(nT))(FieldName=ins)
    ,if(SearchMarker(Marker_ALGCALC,ALGCALC.NREC,Index_ALGCALC),'+',' ')(FieldName=picked_ALGCALC)
    ,if(SearchMarker(Marker_ALGCALCTMPL,ALGCALCTMPL.NREC,Index_ALGCALCTMPL),'+',' ')(FieldName=picked_ALGCALCTMPL)
    ,*
  from
     mTbl
    ,ALGCALC
    ,ALGCALCTMPL
  where((
        root==mTbl.nTbl
    and n[1]==ALGCALC.NREC
    and n[2]==ALGCALCTMPL.NREC
  ));

parameters iDict;

File Dict,Memo;

browse brwRef5 '  ' ('',,sci178InsPM);
  show at (,,,3);
  table mTbl;

  fields { font = { bold = (nI[nT]>0); color = if(picked='+',ColorMark,0) } };
    nInT   '№'     : [2], Skip, Centered, NoAutoSize;
    picked ' '     : [1], Skip, Centered, NoAutoSize;
    ins    'ins'   : [5], Skip, NoAutoSize;
    nTbl 'таблицы' : [10], protect;
    nFld    'поля' : [10], protect;
    nNrec   'nrec' : [10], protect;
    nT     '№ п/а' : [4], protect;
  end;

screen scrRef5 '  ';
  show (,4,,11) fixed_y;
  fields
    ref5Prog : noProtect;
    inTxtFile : noProtect;
    outTxtFile : noProtect;
    batch : noProtect;
    commit : noProtect;
    refGoModulParams : noProtect;
    refGoArgParams : noProtect;
    refGoArgParams2 : noProtect;
  buttons
    cmSF_ViewTable;  cmProcessText;  cmRefC;  cmImportFileToMemo;  cmExportMemoToFile;  cmRefTr;  cmRefGo;
<<
 <. SF_ViewTable .>`-выбор записей в таблицах с Memo полем`
 .@@@@@@@@@@@@@@@@`-.ref Рефал`    `редактор-`<. ProcessText .>
                                 `компилятор-`<.    RefC     .>
 .@@@@@@@@@@@@@@@@ <. ImportFileToMemo .>
 .@@@@@@@@@@@@@@@@ <. ExportMemoToFile .> [.] batch` [.] commit`
 .@@@@@@@@@@@@@@@@`-mods`   параметры  `args-`.@@@@@@@@@@@.@@@@
 <.    RefTr    .>`-tracer`   `интерпретатор-`<.    RefGo    .>
>>
  end;

screen m_nT '  ';
  show (,12,,);
  fields
<<
>>
  end;

text memoID=m_ALGCALC ALGCALC.DESCRIPT ' ALGCALC' : noProtect; show (,12,,);
text memoID=m_ALGCALCTMPL ALGCALCTMPL.DESCRIPT ' ALGCALCTMPL' : noProtect; show (,12,,);

tableEvent table mTbl
  cmPositionChanged:   begin
    if(GetMarkerCount(MarkerNT)=0) refGoArgParams:='('+nT+' 1)';
    if(nI[nT]>0) SetFormat(-65535+nI[nT]+1)
    else SetFormat(m_nT);
    ReDrawPanel(0);
  end;
  cmSetDefault:   begin abort; exit; end;
end;

function PictMarker:string;
begin
var i,b,c:byte;
var s:string;
  s:=''; c:=0;
  for(i:=1;i<=127;i:=i+1)
    if(m[i]=0) { if(c>0) { s:=s+'('+b+' '+c+')'; c:=0; }
    }else{ if(c=0) b:=m[i]; c:=c+1; };
  if(c>0) s:=s+'('+b+' '+c+')';
  PictMarker:=s;
end;

procedure loop_InsertMarker(x:byte);
begin
  bcase(x=0:x:=0
    ,x=1:_loop ALGCALC InsertMarker(selectMarker(nT),ALGCALC.NREC);
    ,x=2:_loop ALGCALCTMPL InsertMarker(selectMarker(nT),ALGCALCTMPL.NREC);
  );
end;

procedure loop_InvertMarker(x:byte);
begin
  bcase(x=0:x:=0
    ,x=1:_loop ALGCALC InvertMarker(selectMarker(nT),ALGCALC.NREC);
    ,x=2:_loop ALGCALCTMPL InvertMarker(selectMarker(nT),ALGCALCTMPL.NREC);
  );
end;

function expFileToMemo(x:byte):boolean;
begin
  expFileToMemo:=bcase(x=0:x=0
    ,x=1:ExportMemoToFile(ALGCALC.DESCRIPT,outTxtFile,false)
    ,x=2:ExportMemoToFile(ALGCALCTMPL.DESCRIPT,outTxtFile,false)
  );
end;

function impFileToMemo(x:byte):boolean;
begin
  impFileToMemo:=bcase(x=0:x=0
    ,x=1:ImportFileToMemo(ALGCALC.DESCRIPT,inTxtFile,false)
    ,x=2:ImportFileToMemo(ALGCALCTMPL.DESCRIPT,inTxtFile,false)
  );
end;

function getNextInsRecord(x:byte;c:comp):boolean;
begin
  getNextInsRecord:=bcase(x=0:x=0
    ,x=1:getFirst ALGCALC where ((c==ALGCALC.NREC))=0
    ,x=2:getFirst ALGCALCTMPL where ((c==ALGCALCTMPL.NREC))=0
  );
end;

function exitExec(var i,j:longint; var b:byte):boolean;
begin
  var c:comp;
  exitExec:=false;
  if(GetMarker(selectMarker(b),j,c)) if(getNextInsRecord(b,c)) { j:=j+1; exitExec:=true; exit; };
  SetBounds(nI[b]);
  if(GetMarkerCount(MarkerNT)=0) { ReDrawPanel(nI[nT]); exit; };
  var oldb:byte; oldb:=b;
  while GetMarker(MarkerNT,i,b) { i:=i+1; if(nI[b]>0) break; }; if(b=oldb) { ReDrawPanel(CurFormatInArea(m_nT)+65535-1); exit; };
  if(GetMarkerCount(selectMarker(b))>0) { j:=0; ReSetBounds(nI[b]);
    if(GetMarker(selectMarker(b),j,c)) if(getNextInsRecord(b,c)) { j:=j+1; exitExec:=true; exit; };
  };
end;

function initExec(var i,j:longint; var b:byte):boolean;
begin
  var c:comp;
  initExec:=false;
  if(batch=0) { initExec:=true; exit; };
  if(GetMarkerCount(MarkerNT)=0) { if(nI[nT]=0) exit; b:=nT;
  }else{ i:=0; while GetMarker(MarkerNT,i,b) { i:=i+1; if(nI[b]>0) break; }; if(nI[b]=0) exit; };
  if(GetMarkerCount(selectMarker(b))>0) { j:=0; ReSetBounds(nI[b]);
    if(GetMarker(selectMarker(b),j,c)) if(getNextInsRecord(b,c)) { j:=j+1; initExec:=true; exit; };
  };
end;

#declare MacroWinMemo(N,T,F,FN)
window win_#T '#T';
browse brw_#T '  ' ('',,sci178InsPM);
  show at (,,20,);
  table #T;
  fields { font = { bold = (#T.#FN=n[#N]); color = if(picked_#T='+',ColorMark,0) } };
    picked_#T ' ' : [1], Skip, Centered, NoAutoSize;
    #T.#FN '#FN' : [10], protect;
  end;
text memoID=mw_#T #T.#F ' #T' : noProtect;
  show (21,,,);
tableEvent table #T
  cmInsertRecord:   begin abort; exit; end;
  cmDeleteRecord:   begin abort; exit; end;
  cmUpdateRecord:   begin update current #T; end;
  cmSetDefault:   begin abort; exit; end;
end;
handleEvent
  cmInit:   begin ReSetBounds(tn#T); end;
  cmDefault:   begin n[#N]:=#T.#FN; ReReadRecord(tn#T); end;
  cmDone:   begin SetBounds(tn#T); end;
  cmSelectAll:   begin
    PushPos(tn#T); ClearMarker(Marker_#T);
    _loop #T InsertMarker(Marker_#T,#T.#FN);
    PopPos(tn#T); ReReadRecord(tn#T);
  end;
  cmUnSelectAll:   begin
    ClearMarker(Marker_#T);
    ReReadRecord(tn#T);
  end;
  cmMarkUnMark:   begin
    if(SearchMarker(Marker_#T,#T.#FN,Index_#T)) DeleteMarker(Marker_#T,#T.#FN)
    else InsertMarker(Marker_#T,#T.#FN);
    RedrawCurrentAndGo(GetCurrentFormat,true);
  end;
  cmInvertAll:   begin
    PushPos(tn#T);
    _loop #T InvertMarker(Marker_#T,#T.#FN);
    PopPos(tn#T); ReReadRecord(tn#T);
  end;
  cmInsert:   begin stop; exit; end;
  cmDelete:   begin stop; exit; end;
end;
end;
#end

#MacroWinMemo(1,ALGCALC,DESCRIPT,NREC)
#MacroWinMemo(2,ALGCALCTMPL,DESCRIPT,NREC)

function updateCurrentTable(x:byte):boolean;
begin
  updateCurrentTable:=bcase(x=0:x=0
    ,x=1:update current ALGCALC=0
    ,x=2:update current ALGCALCTMPL=0
  );
end;

handleEvent
  cmInit:   begin
    var i,j:byte;
    var str,s1,s2,s3,s4:string;
    if(not ExistFile('dict.txt')) iDict:=1;
    if(iDict=1) { Dict.OpenFile('dict.txt',stCreate);
      RunInterface(MemoTbl);
      i:=1;
      if(getFirst mTbl=0)
        do {
          nT:=i; i:=i+1;
          if(update current mTbl=0) { Dict.WriteLn(string(nT)+' '+nTbl+' '+nFld+' '+nNrec); };
        } while getNext mTbl=0;
    } else { Dict.OpenFile('dict.txt',stOpenRead);
        do { Dict.ReadLn(str);
          s1:=substr(str,1,Pos(' ',str)-1); str:=substr(str,length(s1)+2,255);
          s2:=substr(str,1,Pos(' ',str)-1); str:=substr(str,length(s2)+2,255);
          s3:=substr(str,1,Pos(' ',str)-1); str:=substr(str,length(s3)+2,255);
          s4:=str;
          nT:=s1; nTbl:=s2; nFld:=s3; nNrec:=s4;
          if(insert current mTbl=0) {};
        } while not Dict.EOF;
    };
    if( getFirst mTbl = 0 ) {};
    Dict.Close;

    MarkerNT:=InitMarker('Ref5',1,127,10,true);

    i:=1;
    nI[1]:=i; i:=i+1; Marker_ALGCALC:=InitMarker('Ref5_ALGCALC',8,100,10,true);
    nI[2]:=i; i:=i+1; Marker_ALGCALCTMPL:=InitMarker('Ref5_ALGCALCTMPL',8,100,10,true);

    cI:=1; for(i:=1;i<=127;i:=i+1) if(cI<nI[i]) cI:=nI[i]; cI:=cI+1;

    if(not ReadMyDsk(m,'Ref5_m',false)) {i:=0; while GetMarker(MarkerNT,i,j) {i:=i+1; m[j]:=j; }; };

    var cIc:byte;
    if(not ReadMyDsk(cIc,'Ref5_cI',false)) cIc:=1;
    if(cIc>cI) cIc:=1;
    if(cIc>1) if(not ReadMyDsk(n,'Ref5_n',false)) cIc:=1;
    for(i:=cIc;i<cI;i:=i+1) { j:=FindItem(nI,i);
      ReSetBounds(nI[j]);
      if(bcase(j=0:j=0
        ,j=1:getFirst ALGCALC=0
        ,j=2:getFirst ALGCALCTMPL=0
      )) bcase(j=0:j:=0
        ,j=1:n[j]:=ALGCALC.NREC
        ,j=2:n[j]:=ALGCALCTMPL.NREC
      ) else n[j]:=0;
      SetBounds(nI[j]);
    };

    if(not ReadMyDsk(ref5Prog,'Ref5_ref5Prog',false)) ref5Prog:='rev';
    if(not ReadMyDsk(inTxtFile,'Ref5_inTxtFile',false)) inTxtFile:='input.txt';
    if(not ReadMyDsk(outTxtFile,'Ref5_outTxtFile',false)) outTxtFile:='output.txt';
    if(not ReadMyDsk(refGoModulParams,'Ref5_refGoModulParams',false)) refGoModulParams:='reflib -e';
    ReadMyDsk(batch,'Ref5_batch',false);
    ReadMyDsk(commit,'Ref5_commit',false);

    if(GetMarkerCount(MarkerNT)=0) refGoArgParams:='(1 1)'
    else refGoArgParams:=PictMarker; ReDrawPanel(0);

    cIc:=cI-1;
    refGoArgParams2:=FindItem(nI,cIc);

    cfsSetProp('win_ALGCALC',cfpSDIWindow,true);
    cfsSetProp('win_ALGCALCTMPL',cfpSDIWindow,true);
  end;

  cmDone:   begin DoneMarker(MarkerNT,'Ref5');

    DoneMarker(Marker_ALGCALC,'Ref5_ALGCALC');
    DoneMarker(Marker_ALGCALCTMPL,'Ref5_ALGCALCTMPL');

    SaveMyDsk(n,'Ref5_n');
    SaveMyDsk(cI,'Ref5_cI');
    SaveMyDsk(m,'Ref5_m');

    SaveMyDsk(ref5Prog,'Ref5_ref5Prog');
    SaveMyDsk(inTxtFile,'Ref5_inTxtFile');
    SaveMyDsk(outTxtFile,'Ref5_outTxtFile');
    SaveMyDsk(batch,'Ref5_batch')
    SaveMyDsk(commit,'Ref5_commit')
    SaveMyDsk(refGoModulParams,'Ref5_refGoModulParams');
  end;

  cmSelectAll:   begin
    PushPos(#mTbl);
    ClearMarker(MarkerNT); SetLimit(m,0); SetLimit(m,127);
    _loop mTbl { InsertMarker(MarkerNT,mTbl.nT); m[mTbl.nT]:=mTbl.nT; };
    PopPos(#mTbl);
    refGoArgParams:=PictMarker;
    ReReadRecord(#mTbl);
  end;

  cmUnSelectAll:   begin
    ClearMarker(MarkerNT); SetLimit(m,0); SetLimit(m,127);
    refGoArgParams:='('+nT+' 1)';
    ReReadRecord(#mTbl);
  end;

  cmMarkUnMark:   begin
    if(SearchMarker(MarkerNT,mTbl.nT,IndexNT)) {
      DeleteMarker(MarkerNT,mTbl.nT);
      m[mTbl.nT]:=0;
    }else{
      InsertMarker(MarkerNT,mTbl.nT);
      m[mTbl.nT]:=mTbl.nT;
    };
    refGoArgParams:=PictMarker;
    ReDrawPanel(0);
  end;

  cmInvertAll:   begin
    PushPos(#mTbl);
    _loop mTbl {
      InvertMarker(MarkerNT,mTbl.nT);
      m[mTbl.nT]:=if(m[mTbl.nT]=0,mTbl.nT,0);
    };
    PopPos(#mTbl);
    refGoArgParams:=PictMarker;
    ReReadRecord(#mTbl);
  end;

  cmShowAll:   begin
    PushPos(#mTbl);
    _loop mTbl {
      if((ni[nT]=0) or (not SearchMarker(MarkerNT,nT,IndexNT))) continue;
      ClearMarker(selectMarker(nT));
      ReSetBounds(nI[nT]);
      loop_InsertMarker(nT);
      SetBounds(nI[nT]);
    };
    PopPos(#mTbl);
    ReReadRecord(#mTbl);
  end;

  cmHideAll:   begin
    PushPos(#mTbl);
    _loop mTbl {
      if((ni[nT]=0) or (not SearchMarker(MarkerNT,nT,IndexNT))) continue;
      ClearMarker(selectMarker(nT));
    };
    PopPos(#mTbl);
    ReReadRecord(#mTbl);
  end;

  cmCompressLevel:   begin
    PushPos(#mTbl);
    _loop mTbl {
      if((ni[nT]=0) or (not SearchMarker(MarkerNT,nT,IndexNT))) continue;
      ReSetBounds(nI[nT]);
      loop_InvertMarker(nT);
      SetBounds(nI[nT]);
    };
    PopPos(#mTbl);
    ReReadRecord(#mTbl);
  end;

  cmInsert:   begin stop; exit; end;
  cmDelete:   begin stop; exit; end;

  cmDefault:   begin if(CurTable=#mTbl) if(nI[nT]=0) PutCommand(cmSF_ViewTable) else RunWindow(nI[nT]-1); end;

  cmSF_ViewTable:   begin
    var c:comp;
    c:=SF_ViewTable(nTbl,0);
    if((c=0) or (nI[nT]=0)) exit;
    n[nT]:=c;
    ReReadRecord(nI[nT]);
  end;

  cmProcessText:   begin
    ProcessText(ref5Prog+'.ref',0,'');
  end;

  cmRefC:   begin
    var aErr:integer;
    ExecProgram('refc.exe',ref5Prog,'',0,aErr);
  end;

  cmRefGo:   begin
    var aErr:integer;
    var i,j,mSize:longint;
    var b:byte;

    if(initExec(i,j,b))
      do {
        if(batch<>0) {
          if(not IsMemoText(nI[b])) continue;
          if(not bcase(b=0:false
            ,b=1:Memo.OpenMemo(ALGCALC.DESCRIPT)
            ,b=2:Memo.OpenMemo(ALGCALCTMPL.DESCRIPT)
          )) continue;
          mSize:=Memo.GetSize;
          Memo.Close;
          if(mSize=0) continue;

          expFileToMemo(b);
        };

        ExecProgram('refgo.exe',ref5Prog+'+'+refGoModulParams+' '+chr(34)+outTxtFile+chr(34)+' '+chr(34)+inTxtFile+chr(34)+' '+chr(34)+refGoArgParams+chr(34)+' '+refGoArgParams2,'',0,aErr);

        if(batch=0) exit;
        impFileToMemo(b);
        if(commit<>0) if(updateCurrentTable(b)) {};
      } while exitExec(i,j,b);
  end;

  cmRefTr:   begin
    var aErr:integer;
    ExecProgram('reftr.exe',ref5Prog+'+'+refGoModulParams+' '+chr(34)+outTxtFile+chr(34)+' '+chr(34)+inTxtFile+chr(34)+' '+chr(34)+refGoArgParams+chr(34)+' '+refGoArgParams2,'',0,aErr);
  end;

  cmImportFileToMemo:   begin
    if(nI[nT]=0) exit;
    impFileToMemo(nT);
    if(commit<>0) if(updateCurrentTable(nT)) {};
    ReDrawPanel(nI[nT]);
  end;

  cmExportMemoToFile:   begin
    if(nI[nT]=0) exit;
    expFileToMemo(nT);
  end;
end;
end.
!----------------------------------------------------------------------------
т.е. в коде:

Код: Выделить всё

  from
     mTbl
    ,ALGCALC
    ,ALGCALCTMPL
  where((
        root==mTbl.nTbl
    and n[1]==ALGCALC.NREC
    and n[2]==ALGCALCTMPL.NREC
  ));
добавить другие таблицы из (106) доступных.
Образцом будут различные встречающиеся комбинации из N[Номер по алфиту] T[Название таблицы] F[Название Memo поля] I[Название Nrec индекса], а входом строки интерфейса при построчном однопроходном просмотре.
Таких правил всего 10:

Код: Выделить всё

 e.1 e.T e.2 e.T e.3 e.I e.4 e.T e.5 e.T e.6
 e.1 e.T e.2 e.T e.3 e.F e.4 e.T e.5        
 e.1 e.N e.2 e.T e.3 e.F e.4 e.I e.5        
 e.1 e.N e.2 e.T e.3 e.T e.4 e.I e.5        
 e.1 e.N e.2 e.T e.3 e.T e.4                
 e.1 e.N e.2 e.T e.3 e.F e.4                
 e.1 e.N e.2 e.T e.3 e.I e.4                
 e.1 e.N e.2 e.T e.3                        
 e.1 e.T e.2 e.T e.3                        
 e.1 e.T e.2                                
По построению интерфейса создаётся словарь строк вида N T F I для (106) таблиц в файле dict.txt.
Используем его и перед обработкой считаем его и перед закапыванием в виде (N1 T1 F1 I1)(...) используем в качестве фильтра список добавляемых по [Insert] в интерфейсе таблиц в виде : (Начальный_номер_таблицы1 Количество_последовательных_таблиц1)(Начальный_номер_таблицы2 Количество_последовательных_таблиц2)(...).
При распознавании очередной строки интерфейса подставляем в цикле все варианты из выкопанного словаря, в противном случае просто выводим строку как есть. Всё:).

Пример использования - выбираем наш vip файл в текстовом поле по кнопке [Import]:
Изображение
и далее вариант [Заменить старое содержимое]:
Изображение
отметим, что при этом в базу реально уходит обновление (пользовать на свой страх и риск)
В результате:
Изображение

В поле Ref файла вводим mn - просмотр и компиляция как обычно, его код:

Код: Выделить всё

*
* По номерам из Arg3 ["(Начало1 Кол-во1)(Начало2 Кол-во2)(Начало3 ... )"]
* добавить в ref5.vip таблицы с этими номерами из dict.txt по образцам m0-m9,
* в Arg4 [номер п/а] последней ранее добавленной таблицы.
*
$ENTRY Go {  = <Open 'r' 1 'dict.txt'><Br 'dict=' <Pre (<As <Arg 3>>)(<Arg 4>) <Get 1>>>
<Open 'r' 1 <Arg 1>><Open 'w' 2 <Arg 2>>
<Job <Get 1>>
}

Pre {     (e.X)(e.Y) 0                           = ;
(e.1 (e.N) e.2)(e.Y) e.N ' ' e.T ' ' e.F ' ' e.I = ((e.N)(e.T)(e.F)(e.I))            <Pre (e.1 (e.N) e.2)(e.Y) <Get 1>>;
          (e.X)(e.Y) e.Y ' ' e.T ' ' e.F ' ' e.I = <Br 'last=' (e.Y)(e.T)(e.F)(e.I)> <Pre           (e.X)(e.Y) <Get 1>>;
          (e.X)(e.Y) e.Z                         =                                   <Pre           (e.X)(e.Y) <Get 1>>;
}

As {                         = ;
'\(' e.1 ' ' e.2 '\)' e.Tail = <Seq <Numb e.1> <Numb e.2>> <As e.Tail>
}

Seq { s.Begin 0       = ;
      s.Begin s.Count = (<Symb s.Begin>) ' ' <Seq <+ s.Begin 1> <- s.Count 1>>
}

Job {  0 = ;
     e.X = <Put 2 e.X> <m0s0 (<Dg 'last'>) e.X> <Job <Get 1>>
}

m0s0 {
((e.N)(e.T)(e.F)(e.I)) e.1 e.T e.2 e.T e.3 e.I e.4 e.T e.5 e.T e.6 = <m2s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)(e.5)(e.6)><Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.T e.2 e.T e.3 e.F e.4 e.T e.5         = <m5s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)(e.5)>     <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.F e.4 e.I e.5         = <m8s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)(e.5)>     <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.T e.4 e.I e.5         = <m6s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)(e.5)>     <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.T e.4                 = <m9s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)>          <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.F e.4                 = <m7s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)>          <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3 e.I e.4                 = <m4s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)(e.4)>          <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.N e.2 e.T e.3                         = <m1s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)>               <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.T e.2 e.T e.3                         = <m0s1 (<Dg 'dict'>)(e.1)(e.2)(e.3)>               <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.1 e.T e.2                                 = <m3s1 (<Dg 'dict'>)(e.1)(e.2)>                    <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
((e.N)(e.T)(e.F)(e.I)) e.Z                                         =                                                   <Br 'last=' (e.N)(e.T)(e.F)(e.I)>;
}

m2s1 { (e.D) e.X = <m2s2 (e.D) e.X> <Br 'dict=' e.D>; }
m5s1 { (e.D) e.X = <m5s2 (e.D) e.X> <Br 'dict=' e.D>; }
m8s1 { (e.D) e.X = <m8s2 (e.D) e.X> <Br 'dict=' e.D>; }
m6s1 { (e.D) e.X = <m6s2 (e.D) e.X> <Br 'dict=' e.D>; }
m9s1 { (e.D) e.X = <m9s2 (e.D) e.X> <Br 'dict=' e.D>; }
m7s1 { (e.D) e.X = <m7s2 (e.D) e.X> <Br 'dict=' e.D>; }
m4s1 { (e.D) e.X = <m4s2 (e.D) e.X> <Br 'dict=' e.D>; }
m1s1 { (e.D) e.X = <m1s2 (e.D) e.X> <Br 'dict=' e.D>; }
m0s1 { (e.D) e.X = <m0s2 (e.D) e.X> <Br 'dict=' e.D>; }
m3s1 { (e.D) e.X = <m3s2 (e.D) e.X> <Br 'dict=' e.D>; }


m0s2 {                             ()(e.1)(e.2)(e.3)                = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)                = <Put 2 e.1 e.T e.2 e.T e.3>                        <m0s2 (e.tail) (e.1)(e.2)(e.3)>;}
m1s2 {                             ()(e.1)(e.2)(e.3)                = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)                = <Put 2 e.1 e.N e.2 e.T e.3>                        <m1s2 (e.tail) (e.1)(e.2)(e.3)>;}
m2s2 {                             ()(e.1)(e.2)(e.3)(e.4)(e.5)(e.6) = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)(e.5)(e.6) = <Put 2 e.1 e.T e.2 e.T e.3 e.I e.4 e.T e.5 e.T e.6><m2s2 (e.tail) (e.1)(e.2)(e.3)(e.4)(e.5)(e.6)>;}
m3s2 {                             ()(e.1)(e.2)                     = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)                     = <Put 2 e.1 e.T e.2>                                <m3s2 (e.tail) (e.1)(e.2)>;}
m4s2 {                             ()(e.1)(e.2)(e.3)(e.4)           = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)           = <Put 2 e.1 e.N e.2 e.T e.3 e.I e.4>                <m4s2 (e.tail) (e.1)(e.2)(e.3)(e.4)>;}
m5s2 {                             ()(e.1)(e.2)(e.3)(e.4)(e.5)      = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)(e.5)      = <Put 2 e.1 e.T e.2 e.T e.3 e.F e.4 e.T e.5>        <m5s2 (e.tail) (e.1)(e.2)(e.3)(e.4)(e.5)>;}
m6s2 {                             ()(e.1)(e.2)(e.3)(e.4)(e.5)      = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)(e.5)      = <Put 2 e.1 e.N e.2 e.T e.3 e.T e.4 e.I e.5>        <m6s2 (e.tail) (e.1)(e.2)(e.3)(e.4)(e.5)>;}
m7s2 {                             ()(e.1)(e.2)(e.3)(e.4)           = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)           = <Put 2 e.1 e.N e.2 e.T e.3 e.F e.4>                <m7s2 (e.tail) (e.1)(e.2)(e.3)(e.4)>;}
m8s2 {                             ()(e.1)(e.2)(e.3)(e.4)(e.5)      = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)(e.5)      = <Put 2 e.1 e.N e.2 e.T e.3 e.F e.4 e.I e.5>        <m8s2 (e.tail) (e.1)(e.2)(e.3)(e.4)(e.5)>;}
m9s2 {                             ()(e.1)(e.2)(e.3)(e.4)           = ;
      (((e.N)(e.T)(e.F)(e.I)) e.tail)(e.1)(e.2)(e.3)(e.4)           = <Put 2 e.1 e.N e.2 e.T e.3 e.T e.4>                <m9s2 (e.tail) (e.1)(e.2)(e.3)(e.4)>;}
или на экране:
Изображение

Затем в интерфейсе выбираем таблицы по Insert:
Изображение
при этом поле аргумента автоматически изменяется в виде списка ()()()...

Далее как обычно [ExportMemoToFile] [RefGo] и [ImportFileToMemo]:
Изображение

Теперь обратная задача - убрать некоторые таблицы. Ref файл для удаления - rmn.ref:

Код: Выделить всё

*
* По номерам из Arg3 ["(Начало1 Кол-во1)(Начало2 Кол-во2)(Начало3 ... )"]
* удалить в ref5.vip таблицы с этими номерами из dict.txt по образцам m0-m9.
*
$ENTRY Go {  = <Open 'r' 1 'dict.txt'><Br 'dict=' <Pre (<As <Arg 3>>) <Get 1>>>
               <Open 'r' 1 <Arg 1>> <Open 'w' 2 <Arg 2>> <Job <Get 1>>
}

Pre {     (e.X) 0                           = ;
(e.1 (e.N) e.2) e.N ' ' e.T ' ' e.F ' ' e.I = ((e.N)(e.T)(e.F)(e.I)) <Pre (e.1 (e.N) e.2) <Get 1>>;
          (e.X) e.Z                         =                        <Pre           (e.X) <Get 1>>;
}

As {                         = ;
'\(' e.1 ' ' e.2 '\)' e.Tail = <Seq <Numb e.1> <Numb e.2>> <As e.Tail>
}

Seq { s.Begin 0       = ;
      s.Begin s.Count = (<Symb s.Begin>) ' ' <Seq <+ s.Begin 1> <- s.Count 1>>
}

Job {  0 = ;
     e.X = <m0s0 (<Dg 'dict'>) e.X> <Job <Get 1>>
}

m0s0 {
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.T e.2 e.T e.3 e.I e.4 e.T e.5 e.T e.6 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.T e.2 e.T e.3 e.F e.4 e.T e.5         = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.F e.4 e.I e.5         = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.T e.4 e.I e.5         = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.T e.4                 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.F e.4                 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3 e.I e.4                 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.N e.2 e.T e.3                         = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.T e.2 e.T e.3                         = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.1 e.T e.2                                 = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail>;
(e.head ((e.N)(e.T)(e.F)(e.I)) e.tail) e.X                                         = <Br 'dict=' e.head ((e.N)(e.T)(e.F)(e.I)) e.tail> <Put 2 e.X>;
}
на экране:
Изображение

Выбираем таблицы для удаления (не забываем скомпилить - один раз):
Изображение

Далее как обычно [ExportMemoToFile] [RefGo] и [ImportFileToMemo]:
Изображение

Теперь добавим таблицу к уже изменённому интерфейсу:
Изображение

тут отличие только в том, что нужно знать номер по алфавиту последней добавленной ранее таблицы, смотрим её номер и вводим его в поле дополнительного аргумента, в нашем случае [25]:
Изображение

Наконец результат устраивает:
Изображение
Остаётся сохранить новый Ref5.vip и скомпилить его как обычно.

Примечание: у таблицы HierZar нет односегментного индекса Nrec

Re: Использую Рефал в Галактике:)

Добавлено: 16 ноя 2010, 11:14
LaaLaa
Все это интересно. Но только не понятно к каким прикладным задачам это может быть применено?

Академический смысл понятен, но практический не очень.

Re: Использую Рефал в Галактике:)

Добавлено: 16 ноя 2010, 11:52
pk
>Академический смысл понятен, но практический не очень
Согласен с LaaLaa;) Каждый из нас может припомнить мудрёных узкоспецифических задач, когда-то решавшихся в "Гал", но не стоит, наверное, без необходимости помещать это здесь?

Re: Использую Рефал в Галактике:)

Добавлено: 16 ноя 2010, 13:15
LaaLaa
К стати. В тему функциональных языков программирования. Мы недавно с коллегами рассматривали теоретическую возможность применения языка Haskel или F#. Для реализации циклических ПАТ-отчетов и расчетов в ТХО. :idea:

Re: Использую Рефал в Галактике:)

Добавлено: 16 ноя 2010, 14:25
sensoft
LaaLaa
нравится Хаскел!

Практичный пример глобальной трансформации - чистка Memo полей,
код clr.ref:

Код: Выделить всё

$ENTRY Go {  = <Open 'r' 1 <Arg 1>>
               <Open 'w' 2 <Arg 2>>
               <Job <Get 1>>
}

Job {
  0 = ;
e.X = <Job <Get 1>>
}
в интерфейсе помечаем таблицы по [Insert] или сразу все [Gray Plus] и записи по [Ctrl+Gray Plus], выставляем checkbox [commit] и [batch] и [RefGo].
Примечание: При компиляции нет проблем добавить в ЛТ все (106) таблиц, а при выполнении по дефолту есть ограничение в (20).

Re: Использую Рефал в Галактике:)

Добавлено: 16 ноя 2010, 15:53
LaaLaa
sensoft писал(а):LaaLaa
нравится Хаскел!
Не осилил толком его пока. Из за разрыва черепной коробки.

Re: Использую Рефал в Галактике:)

Добавлено: 16 ноя 2010, 22:38
galover
sensoft
Не осилил твой пример. В чем там суть, и какая практическая польза? Поясни, если не сложно, человеческим языком. В кодогенерации? В динамической компиляции в рантайме. Есть V4A, чем не устроил?

Re: Использую Рефал в Галактике:)

Добавлено: 17 ноя 2010, 00:12
sensoft
galover
Хочу вернуться к естественной для себя форме работы с символьной информацией:). Интерфейс пока классический, но что-то уже можно, напр: генерить скрипты, разбирать формы, может доказательства для уменьшения теста. В примере демка множественного нагибания Memo:))).

Re: Использую Рефал в Галактике:)

Добавлено: 17 ноя 2010, 02:49
LaaLaa
galover писал(а):Не осилил твой пример. В чем там суть, и какая практическая польза? Поясни, если не сложно, человеческим языком. В кодогенерации? В динамической компиляции в рантайме. Есть V4A, чем не устроил?
Ключевая фишка здесь использовать именно функциональный язык программирования, как альтернативу процедурному (императивному) языку.

Разница межу этим и языками в методах программирования. Ссылка по теме на википедии: http://ru.wikipedia.org/wiki/%D0%AF%D0% ... 0%B8%D1%8F

Re: Использую Рефал в Галактике:)

Добавлено: 17 ноя 2010, 10:46
galover
LaaLaa
я в курсе, что есть функциональные языки, я не уловил, какая цель преследуется в приведенном примере

Re: Использую Рефал в Галактике:)

Добавлено: 17 июн 2011, 00:04
Max_Fin
Хм... Соль есть, только куда солить не ясно.

Re: Использую Рефал в Галактике:)

Добавлено: 18 авг 2011, 00:10
sensoft
Max_Fin писал(а):Хм... Соль
Увы, не нашёл eBNF's для ВИП и vip.exe не open-source. А потому специализация откладывается:)