在 Maple(版本 14,如果重要的话)中,我定义了一个在 maple 中使用全局定义表达式的过程,但是当我进行代码生成时,它假定变量不是我所期望的。
a:=x+y*x
p := proc (x::float, y::float); return a; end proc;
C(p)
我期望的是一个将表达式插入代码中的 C 函数,但我得到了......
double p (double x, double y)
{
return(a);
}
在 Maple(版本 14,如果重要的话)中,我定义了一个在 maple 中使用全局定义表达式的过程,但是当我进行代码生成时,它假定变量不是我所期望的。
a:=x+y*x
p := proc (x::float, y::float); return a; end proc;
C(p)
我期望的是一个将表达式插入代码中的 C 函数,但我得到了......
double p (double x, double y)
{
return(a);
}
这是那些“设计”的事情之一。尽管在这种特殊情况下对您来说可能看起来很尴尬,但(现代)Maple 的这种词法作用域行为通常是一种优势,而且是经过深思熟虑的。有几种方法可以满足您的期望。
在这种情况下,最简单的解决方法可能就是:
restart:
a:=x+y*x:
p := proc(x::float, y::float) return a; end proc;
p := proc(x::float, y::float) return a end proc;
CodeGeneration:-C( subs('a'=a,eval(p)) );
double cg (double x, double y)
{
return(x + y * x);
}
上面完成的是subs('a'=a,eval(p))
形成 proc 的一个新实例,p
其中a
在 proc 主体中被显式值替换a
(即a
评估结果)。注意以下的输出,并与上面p
最初创建时的输出进行比较,
subs('a'=a,eval(p));
proc(x::float, y::float) return x + y*x end proc;
请记住,即使在这个非常简单的解决方法示例中并不明显,给定的全局名称替换x
和y
该副本p
实际上是在使用 Maple 的范围规则玩一个棘手的游戏。在更复杂的范围界定情况下,这可能会失控。但是,如果您真正想要的是内联,那么您可以通过更明确和可控的方式获得它。查看p
下一个示例中最初创建时的回显输出,
restart:
a := proc(A,B) option inline; A+B*A: end proc;
a := proc(A, B) option inline; A + B*A end proc;
p := proc(x::float, y::float) return a(x,y); end proc;
p := proc(x::float, y::float) return x + y*x end proc;
CodeGeneration:-C( p );
double p (double x, double y)
{
return(x + y * x);
}
希望这两种方法足以让您度过难关。
让我们简单地回到你原来的例子,只是为了注意一些事情。全局名称x
和y
它们出现在的值中a
与最初创建的过程的两个形式参数的名称非常不同p
。它们是完全不同的例子,只是看起来是同一个名字。考虑,
restart:
a:=x+y*x:
p := proc(x::float, y::float) return a; end proc;
p := proc(x::float, y::float) return a end proc;
p(4.0, 5.0);
x + y x