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

База знаний

Модераторы: m0p3e, edward_K, Модераторы

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

Сообщение sensoft » Пн ноя 15, 2010 23:06

Пример vip интерфейса к интерпретатору Рефал-5: http://sites.google.com/site/svobodnyefajly/files/ref5_source_20101115.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/bin/ref5_041029_bin_winNT.zip
Последний раз редактировалось sensoft Вт июл 19, 2011 14:43, всего редактировалось 2 раз(а).
Аватара пользователя
sensoft
Постоянный гость
 
Сообщения: 67
Зарегистрирован: Вт апр 15, 2008 16:48
Откуда: Череповец
Reputation point: 29

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

Сообщение sensoft » Пн ноя 15, 2010 23:19

начальный вид:
Изображение
в табличной форме список таблиц с 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]:
Изображение
продолжение следует:)
Аватара пользователя
sensoft
Постоянный гость
 
Сообщения: 67
Зарегистрирован: Вт апр 15, 2008 16:48
Откуда: Череповец
Reputation point: 29

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

Сообщение sensoft » Вт ноя 16, 2010 06:18

Пример подстановок по таблице.

Рассмотрим задачу расширения списка рабочих таблиц с 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
Аватара пользователя
sensoft
Постоянный гость
 
Сообщения: 67
Зарегистрирован: Вт апр 15, 2008 16:48
Откуда: Череповец
Reputation point: 29

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

Сообщение LaaLaa » Вт ноя 16, 2010 12:14

Все это интересно. Но только не понятно к каким прикладным задачам это может быть применено?

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

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

Сообщение pk » Вт ноя 16, 2010 12:52

>Академический смысл понятен, но практический не очень
Согласен с LaaLaa;) Каждый из нас может припомнить мудрёных узкоспецифических задач, когда-то решавшихся в "Гал", но не стоит, наверное, без необходимости помещать это здесь?
С ув..
pk
Постоянный обитатель
 
Сообщения: 135
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: Москва Связьтранснефть
Reputation point: 26

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

Сообщение LaaLaa » Вт ноя 16, 2010 14:15

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

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

Сообщение sensoft » Вт ноя 16, 2010 15:25

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).
Аватара пользователя
sensoft
Постоянный гость
 
Сообщения: 67
Зарегистрирован: Вт апр 15, 2008 16:48
Откуда: Череповец
Reputation point: 29

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

Сообщение LaaLaa » Вт ноя 16, 2010 16:53

sensoft писал(а):LaaLaa
нравится Хаскел!


Не осилил толком его пока. Из за разрыва черепной коробки.
LaaLaa
 

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

Сообщение galover » Вт ноя 16, 2010 23:38

sensoft
Не осилил твой пример. В чем там суть, и какая практическая польза? Поясни, если не сложно, человеческим языком. В кодогенерации? В динамической компиляции в рантайме. Есть V4A, чем не устроил?
galover
Местный житель
 
Сообщения: 794
Зарегистрирован: Пт ноя 16, 2007 14:52
Reputation point: 27

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

Сообщение sensoft » Ср ноя 17, 2010 01:12

galover
Хочу вернуться к естественной для себя форме работы с символьной информацией:). Интерфейс пока классический, но что-то уже можно, напр: генерить скрипты, разбирать формы, может доказательства для уменьшения теста. В примере демка множественного нагибания Memo:))).
Аватара пользователя
sensoft
Постоянный гость
 
Сообщения: 67
Зарегистрирован: Вт апр 15, 2008 16:48
Откуда: Череповец
Reputation point: 29

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

Сообщение LaaLaa » Ср ноя 17, 2010 03:49

galover писал(а):Не осилил твой пример. В чем там суть, и какая практическая польза? Поясни, если не сложно, человеческим языком. В кодогенерации? В динамической компиляции в рантайме. Есть V4A, чем не устроил?


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

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

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

Сообщение galover » Ср ноя 17, 2010 11:46

LaaLaa
я в курсе, что есть функциональные языки, я не уловил, какая цель преследуется в приведенном примере
galover
Местный житель
 
Сообщения: 794
Зарегистрирован: Пт ноя 16, 2007 14:52
Reputation point: 27

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

Сообщение Max_Fin » Пт июн 17, 2011 00:04

Хм... Соль есть, только куда солить не ясно.
Жду выхода Вселенная 2.12!
Аватара пользователя
Max_Fin
На пенсии
 
Сообщения: 797
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: г. Тюмень
Reputation point: 0

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

Сообщение sensoft » Чт авг 18, 2011 00:10

Max_Fin писал(а):Хм... Соль
Увы, не нашёл eBNF's для ВИП и vip.exe не open-source. А потому специализация откладывается:)
Аватара пользователя
sensoft
Постоянный гость
 
Сообщения: 67
Зарегистрирован: Вт апр 15, 2008 16:48
Откуда: Череповец
Reputation point: 29


Вернуться в Опыт

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1