Maple代码生成:如何自动声明变量?

时间:2011-02-28 19:07:36

标签: c declaration maple

在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);
}

1 个答案:

答案 0 :(得分:2)

这是“按设计”的东西之一。尽管在这种特殊情况下你可能看起来很尴尬,但(现代)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;

请记住,尽管在这个非常简单的解决方法示例中并不明显,但全局名称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