Passing Function as an argument to another Function

Vino vino.bheeman at hotmail.com
Mon Dec 4 11:05:22 UTC 2017


On Monday, 4 December 2017 at 10:46:03 UTC, rikki cattermole 
wrote:
> On 04/12/2017 10:36 AM, Vino wrote:
>> Hi Rikki,
>> 
>>    Thank you very much, I tired the above code and it is 
>> working, so another help on the same topic.
>> IF my function (First) of below type when who do we define the 
>> Mid function
>> 
>> Array!(Tuple!(string, string))  First(string Ftext)
>> 
>> Tried the below  but no luck
>> void mid(Array!(Tuple!(string, string)) function(string) func, 
>> string mtext) {
>>       func(mtext);
>> }
>
> Looks valid.
>
> mid(&First, "Str");
>
> So error + full source please.

Hi Rikki,

  The original program is as below

Full Program:
import core.stdc.stdlib: exit;
import std.algorithm: all, among, canFind, each, endsWith, 
filter, map, setDifference, sort, uniq, reduce;
import std.array: join;
import std.container.array;
import std.conv: to;
import std.datetime.systime: Clock, days, SysTime;
import std.file: dirEntries, exists, getcwd, isFile, mkdir, 
remove, rmdirRecurse, SpanMode;
import std.format: format;
import std.net.isemail;
import std.parallelism: parallel, taskPool;
import std.path: baseName, dirName, globMatch, isValidFilename, 
isValidPath;
import std.process: execute;
import std.range: chain, chunks, empty, zip;
import std.stdio: File, writefln, writeln;
import std.string: chomp, chop, isNumeric, split, strip;
import std.typecons: tuple, Tuple;
import std.uni: isAlpha, isWhite, toLower;

Array!(Tuple!(string, string)) coAgedDirClean (string FFs, string 
Step, int DirAged) {
	auto dFiles = Array!(Tuple!(string, string))(dirEntries(FFs, 
SpanMode.shallow).filter!(a => a.isDir && !globMatch(a.baseName, 
"*DND*") && a.timeCreated < dtAges(DirAged)).map!(a => 
tuple(a.name, a.timeCreated.toSimpleString[0 .. 20])));
	if (Step == "run") { dFiles.each!(f => f[0].rmdirRecurse); } 
return dFiles;
}

void ptProcessFiles() (Array!string Dirlst,  
Array!(Tuple!(string, string)) function(string, string, int) 
coRoutine, File logF, File logE, string Step, int Aged) {
Array!(Tuple!(string, string)) PFtext, PFdata;
auto PFresult = taskPool.workerLocalStorage(PFtext);
try {
	foreach (string FFs; parallel(Dirlst[0 .. $],1)) { PFresult.get 
~= coRoutine(FFs.strip, Step, Aged); }
		logF.writeln("Function \t : Delete of the Files which are not 
placed in correct Location and list those deleted");
		logF.writeln("Dir. Scanned \t :", Dirlst[]);
		logF.writeln("************************************************************************************");
		logF.writefln("%-63s %.20s", "File Name", "CreationTime");
		logF.writeln("************************************************************************************");
		foreach(i; PFresult.toRange)  { PFdata ~= i[][]; }
			if (!PFdata.empty) { logF.writefln("%(%-(%-63s %s %)\n%)", 
PFdata[].sort!((a,b) => a[0] < b[0])); }
		logF.writeln("************************************************************************************");
} 	catch (Exception e) { logE.writeln(e.msg); }
}

SysTime dtAges (int Ages) {
	auto ct2 = Clock.currTime();
	auto st2 = ct2 + days(-Ages);
	return st2;
}

void main () {
auto CleanDirlst = "C:\\Temp\\BACKUP, C:\\Temp\\EXPORT";
auto logF = 
File("C:\\Users\\bheev1\\Desktop\\Current\\Script\\D\\Logs\\Rlog.log", "a");
auto logE = 
File("C:\\Users\\bheev1\\Desktop\\Current\\Script\\D\\Logs\\Elog.log", "a");
string Step = "dryrun";
int DirAged = 1;
ptProcessFiles(CleanDirlst, &coAgedDirClean, logF, logE, Step, 
DirAged);
}

Error:

FunTest.d(52): Error: template FunTest.ptProcessFiles cannot 
deduce function from argument types !()(string, 
Array!(Tuple!(string, string)) function(string FFs,
  string Step, int DirAged), File, File, string, int), candidates 
are:
FunTest.d(24):        FunTest.ptProcessFiles()(Array!string 
Dirlst, Array!(Tuple!(string, string)) function(string, string, 
int) coRoutine, File logF, File logE
, string Step, int Aged)
Failed: ["dmd", "-v", "-o-", "FunTest.d", "-I."]

From,
Vino.B


More information about the Digitalmars-d-learn mailing list