構文要素に対応するクラス(DomainFunction クラス:関数(引数は数値)の呼び出し)
<summary>
</summary>
internal class DomainFunction : Term
{
<summary>
</summary>
private readonly Identifier name;
<summary>
</summary>
private readonly IEnumerable<DomainExpression> list;
public DomainFunction(Identifier name, IEnumerable<DomainExpression> list)
{
this.name = name;
this.list = list;
}
<summary>
</summary>
<param name="env"></param>
<param name="prog"></param>
<returns></returns>
public FreeMonoid<int> Eval(Env<FreeMonoidUnion> env, Prog prog)
{
Definition? definition = prog.FindDefinition(name.Name);
if (definition == null)
{
return FreeMonoid<int>.Zero;
}
else
{
IEnumerable<string> namelist = definition.ParamList.Select(x => x.Name);
IEnumerable<Number> valuelist = list.Select(x => x.Eval(env));
IEnumerable<FreeMonoidUnion> unionlist = valuelist.Select(x => new FreeMonoidUnion(x));
env = env.DefineList(namelist, unionlist);
return definition.Exp.Eval(env, prog);
}
}
<summary>
</summary>
<returns></returns>
public string Print()
{
string prms = string.Join(", ", list.Select(x => x.Print()));
return $"{name.Print()}({prms})";
}
<summary>
</summary>
<param name="yieldp"></param>
<param name="typep"></param>
<param name="indp"></param>
<param name="indcount"></param>
<param name="perf"></param>
<returns></returns>
public string GeneratePython(bool yieldp, bool typep, bool indp, int indcount, Func<string, string> perf)
{
if (yieldp)
{
return $"yield from {name.Print()}(" + Prog.ListGeneratePython(false, typep, false, indcount, perf, ", ", list) + ")";
}
else
{
return $"{name.Print()}(" + Prog.ListGeneratePython(false, typep, false, indcount, perf, ", ", list) + ")";
}
}
<summary>
</summary>
<param name="yieldp"></param>
<param name="typep"></param>
<param name="indp"></param>
<param name="indcount"></param>
<param name="perf"></param>
<returns></returns>
public string GenerateCS(bool yieldp, bool typep, bool indp, int indcount, Func<string, string> perf)
{
if (yieldp)
{
return $"foreach (int e in {name.Print()}(" + Prog.ListGenerateCS(false, typep, false, indcount, perf, ", ", list) + $"))\r\n" + Prog.GenerateCSBlock(indcount, true, "yield return e;\r\n");
}
else
{
return $"{name.Print()}(" + Prog.ListGenerateCS(false, typep, false, indcount, perf, ", ", list) + ")";
}
}
}
