Page 1 of 1

aEVAL

Posted: Tue Oct 11, 2016 4:14 pm
by unixkd
Hi All

Is it possible to extend aEval(...) like: Call it DC_AEval(...)

DC_AEval( <aArray>, <bBlock>, [<nStart>], [<nCount>], [<lAssign>],[<bFor>], [<bWhile>] ) --> aArray

Similar to DC_ForNext(...)

DC_ForNext ( <nStart>, ;
<nEnd>, ;
[<nStep>], ;
<bEval>, ;
[<bWhile>],;
[<bFor>] ) -> NIL

Thanks.

Joe.

Re: aEVAL

Posted: Tue Oct 11, 2016 4:42 pm
by rdonnay
What is <lAssign> for?

Re: aEVAL

Posted: Tue Oct 11, 2016 5:02 pm
by rdonnay
Here is the function you wanted, with the exception of lAssign.

Code: Select all

#INCLUDE "dcdialog.CH"
#INCLUDE "directry.CH"

FUNCTION Main()

LOCAL aDir, bEval, bFor, bWhile

aDir := Directory('C:\exp20\source\dclipx\*.*')

wtf aDir

bEval := {|a|Qout(Pad(a[F_NAME],20)),QQout(a[2])}

bFor := {|a|a[F_SIZE] > 2000 }

bWhile := {|a|a[F_SIZE] < 200000 }

DC_AEval( aDir, bEval,,,, bFor, bWhile)

wtf 'stop' pause

RETURN nil

* ------------

FUNCTION DC_Aeval( aArray, bBlock, nStart, nCount, lAssign, bFor, bWhile )

LOCAL nLen := Len(aArray), i, n := 0

DEFAULT nStart := 1, ;
        nCount := nLen

FOR i := nStart TO nLen
  IF n++ >= nCount
    EXIT
  ENDIF
  IF !Empty(bWhile) .AND. !Eval(bWhile,aArray[i])
    EXIT
  ENDIF
  IF Empty(bFor) .OR. Eval(bFor,aArray[i])
    Eval( bBlock, aArray[i] )
  ENDIF
NEXT

RETURN aArray

Re: aEVAL

Posted: Wed Oct 12, 2016 12:45 am
by unixkd
Thanks Roger

lAssign is as used in aEval() function of Xbase++

The logical expression <lAssign> determines whether an assignment to the passed array element is permitted within the code block. If <lAssign> equals .T. (true), the array element is passed to the code block by reference. If an assignment to the first code block parameter is made, it is reflected in the corresponding array element.

Joe

Re: aEVAL

Posted: Wed Oct 12, 2016 6:17 am
by rdonnay
lAssign is as used in aEval() function of Xbase++
I never noticed that parameter before.
Here is an updated DC_Aeval() function and a new test program.

DC_AEval() is first called to change the file names in the array to upper case.

DC_AEval() is then called to output the file names and sizes to the screen.

Code: Select all

#INCLUDE "dcdialog.CH"
#INCLUDE "directry.CH"

FUNCTION Main()

LOCAL aDir, bEval, bFor, bWhile

aDir := Directory('C:\expd20\source\dclipx\*.*')

bEval := {|a|a[F_NAME] := Upper(a[F_NAME])}
DC_AEval( aDir, bEval,,,.t., )

bEval := {|a|Qout(Pad(a[F_NAME],20)),QQout(a[2])}
bFor := {|a|a[F_SIZE] > 2000 }
bWhile := {|a|a[F_SIZE] < 200000 }
DC_AEval( aDir, bEval,,,, bFor, bWhile)

wait

RETURN nil

* ------------

FUNCTION DC_Aeval( aArray, bBlock, nStart, nCount, lAssign, bFor, bWhile )

LOCAL nLen := Len(aArray), i, n := 0

DEFAULT nStart := 1, ;
        nCount := nLen, ;
        lAssign := .f.

FOR i := nStart TO nLen
  IF n++ >= nCount
    EXIT
  ENDIF
  IF !Empty(bWhile) .AND. !Eval(bWhile,aArray[i])
    EXIT
  ENDIF
  IF Empty(bFor) .OR. Eval(bFor,aArray[i])
    IF lAssign
      Eval( bBlock, @aArray[i] )
    ELSE
      Eval( bBlock, aArray[i] )
    ENDIF
  ENDIF
NEXT

RETURN aArray

Re: aEVAL

Posted: Thu Oct 13, 2016 2:46 am
by unixkd
Thanks Roger

That is excellent. Will be a good addition to eXpress++ next release.

Joe