gpt4 book ai didi

c - 扩展 Maple 代码生成中的变量名称

转载 作者:行者123 更新时间:2023-11-30 15:58:03 29 4
gpt4 key购买 nike

我想通过分段函数的处理程序扩展 Maple CodeGeneration[C](不知道为什么不包含它)。为此我做了:

with(CodeGeneration):
with(LanguageDefinition):

LanguageDefinition:-Define("NewC", extend="C",
AddFunction("piecewise", anything::numeric,
proc()
local i;
Printer:-Print("if(",_passed[1],"){",_passed[2],"}");
for i from 3 to _npassed-2 by 2 do
Printer:-Print("else if(",_passed[i],"){",_passed[i+1],"}");
end do;
Printer:-Print("else{",_passed[_npassed],"}");
end proc,
numeric=double)
);

请注意,我使用 if else 语句来支持 case 语句。这是要翻译的示例代码:

myp:=proc(x::numeric)
piecewise(x>1,1*x,x>2,2*x,x>3,3*x,0);
end proc:
Translate(myp, language="NewC");

输出为

void myp (double x)
{
if(0.1e1 < x){x}else if(0.2e1 < x){0.2e1 * x}else if(0.3e1 < x){0.3e1 * x}else{0};
;
}

对于有效的 C 例程,我显然需要替换大括号,例如

{x}

通过类似

{result=x;}

其他的也类似。我可以通过修改上面的 AddFunction 语句中的字符串来手动完成此操作。但是代码生成器不知道变量名 result,因此不会有任何声明,也不会根据需要返回 result 的值来匹配例程 myp 或任何更复杂的过程,其中分段的结果可能被赋值到一些其他变量或用于计算。那么我该如何在 CodeGeneration 例程中正确处理这个问题呢? IE。我怎样才能获得有效的变量名称等。

最佳答案

像这样怎么样?

restart:

with(CodeGeneration):
with(LanguageDefinition):

LanguageDefinition:-Define("NewC", extend="C",
AddFunction("piecewise", anything::numeric,
proc()
local i;
Printer:-Print("( (",_passed[1],") ? ",_passed[2]);
for i from 3 to _npassed-2 by 2 do
Printer:-Print(" : (",_passed[i],") ? ",_passed[i+1]);
end do;
Printer:-Print(" : ",_passed[_npassed]," ) ");
end proc,
numeric=double)
);

myp:=proc(x::numeric) local result::numeric;
result := piecewise(x>3,3*x,x>2,2*x,x>1,1*x,0);
end proc:

Translate(myp, language="NewC");

double myp (double x)
{
double result;
result = ( (0.3e1 < x) ? 0.3e1 * x : (0.2e1 < x) ? 0.2e1 * x : (0.1e1 < x) ? x : 0 ) ;
return(result);
}

[已编辑,添加以下 Material ]

事实证明,CodeGeneration[C] 确实可以处理分段,但前提是提供了optimize 选项。 (我将提交一个错误报告,它应该被默认处理。)

restart:

with(CodeGeneration):
with(LanguageDefinition):
myp:=proc(x::numeric) local result::numeric;
result:=piecewise(x>3,3*x,x>2,2*x,x>1,1*x,0);
end proc;

myp := proc(x::numeric)
local result::numeric;
result := piecewise(3 < x, 3*x, 2 < x, 2*x, 1 < x, x, 0)
end proc;

Translate(myp, language="C", optimize);

double myp (double x)
{
double result;
double s1;
if (0.3e1 < x)
s1 = 0.3e1 * x;
else if (0.2e1 < x)
s1 = 0.2e1 * x;
else if (0.1e1 < x)
s1 = x;
else
s1 = 0.0e0;
result = s1;
return(result);
}

如您所见,上面的piecewise 是通过转换为单独的if(){..} block 来处理的,并分配给引入的临时变量。随后,只要 Maple 过程中存在分段调用,就会使用该临时值。并宣布临时。很好而且自动。因此,这可能足以满足您分段的使用。

您还询问如何在您自己的扩展中引入和声明此类临时变量(如果我理解正确的话)。继续上面的同一个 Maple session ,这里有一些沿着这些思路的想法。生成未分配的全局名称。 myp 过程被置于惰性形式,新的局部变量被添加到其中。然后,改变后的惰性形式又变回实际的程序。作为说明,我使用原始扩展的修改版本来处理分段。这一切都产生了接近可接受的结果。唯一的障碍是赋值语句,

result = temporary_variable;

位置不对!它位于分段翻译 block 之前。我还不知道如何在方法中修复它。

LanguageDefinition:-Define("NewC", extend="C",
AddFunction("piecewise", anything::numeric,
proc()
global T;
local i, t;
t:=convert(T,string);
Printer:-Print(t,";\n");
Printer:-Print(" if (",_passed[1],
")\n { ",t," = ",_passed[2],"; }\n");
for i from 3 to _npassed-2 by 2 do
Printer:-Print(" else if (",_passed[i],")\n { ",
t," = ",_passed[i+1],"; }\n");
end do;
Printer:-Print(" else { ",t," = ",_passed[_npassed],"; }");
end proc,
numeric=double)
):

T:=`tools/genglobal`('s'):

newmyp := FromInert(subsindets(ToInert(eval(myp)),'specfunc(anything,_Inert_LOCALSEQ)',
z->_Inert_LOCALSEQ(op(z),
_Inert_DCOLON(_Inert_NAME(convert(T,string)),
_Inert_NAME("numeric",
_Inert_ATTRIBUTE(_Inert_NAME("protected",
_Inert_ATTRIBUTE(_Inert_NAME("protected")
))))))));

newmyp := proc(x::numeric)
local result::numeric, s::numeric;
result := piecewise(3 < x, 3*x, 2 < x, 2*x, 1 < x, x, 0)
end proc;

Translate(newmyp, language="NewC");

double newmyp (double x)
{
double result;
double s;
result = s;
if (0.3e1 < x)
{ s = 0.3e1 * x; }
else if (0.2e1 < x)
{ s = 0.2e1 * x; }
else if (0.1e1 < x)
{ s = x; }
else { s = 0; };
return(result);
}

如果您重新运行上面的最后三个语句(从对 T 的赋值,到 Translate 调用),那么您应该会看到使用了一个新的临时变量,例如s0。如果再次重复,然后是 s1。等等。

也许这会给您带来更多的想法。干杯。

关于c - 扩展 Maple 代码生成中的变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10064729/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com