在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))形成procp的一个新实例,其中a在proc主体中被a的显式值替换(即a的计算结果)。注意下面的输出,并与最初创建p时的输出进行比较,
subs('a'=a,eval(p));

   proc(x::float, y::float) return x + y*x end proc;

请记住,尽管在这个非常简单的解决方法示例中并不明显,但是将全局名称xy替换到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中出现的全局名ya与最初创建的过程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

关于c - Maple代码生成:如何自动声明变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5146395/

10-12 15:04