【问题标题】:Maple Code Generation: How to declare variables automatically?Maple 代码生成:如何自动声明变量?
【发布时间】:2011-02-28 19:07:36
【问题描述】:

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

【问题讨论】:

    标签: c declaration maple


    【解决方案1】:

    这是那些“设计”的事情之一。尽管在这种特殊情况下对您来说可能看起来很尴尬,但(现代)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);
       }
    

    希望这两种方法足以帮助您度过难关。

    让我们简要地回到你原来的例子,只是为了注意一些事情。出现在a 值中的全局名称xy 与最初创建的过程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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2017-03-14
      • 2015-10-17
      • 1970-01-01
      相关资源
      最近更新 更多