Sometimes you need to think about fucture.
Source code is to you, not to the computer.
May be you need update the code for a long time, and may be next year you have work to remember what you do.
But sometimes speed is more important.
Last days I do this, using hb_AScan() inside hb_ASCan()
Once hb_AScan() process each element, may be could do a Eval() or AEval()
LOCAL aNoTestList := { ;
{ "no check", "demoall.prg", "testsamples.prg" }, ;
{ "MDI", "a.prg", "testmdi.prg", "testrtf.prg", "demomdi.prg" }, ;
{ "utility?", "buildpelles.prg", "dbview.prg" }, ;
{ "multithead", "demomenumt.prg" }, ;
{ "window", "demoonother.prg" }, ;
{ "postgress", "grid_2.prg", "grid_3.prg" }, ;
{ "console", "helloworld.prg" }, ;
{ "undefined", "propsh.prg", "tststconsapp.prg", "helpstatic.prg", ;
"tstprdos.prg", "winprn.prg", "testalert.prg", "pseudocm.prg", ;
"bincnts.prg", "bindbf.prg", "hexbincnt.prg" }, ;
{ "bug", "tstscrlbar.prg", "helpdemo.prg" } }
aList := Directory( "*.prg" )
FOR EACH aFile IN aList
IF hb_AScan( aNoTestList, { |a| hb_AScan( a, { |b| ;
b == Lower( aFile[1] ) } ) != 0 } ) != 0
LOOP
ENDIF
...
NEXT