Chapel中的回调函数

5

我有以下的 Chapel 代码。

proc update(x: int(32)) {
  return 2*x;
}

proc dynamics(x: int(32)) {
  return update(x);
}

writeln(dynamics(7));

我希望向发送某种回调,类似于:
proc update(x: int(32)) {
  return 2*x;
}

proc dynamics(x: int(32), f: ?) {
  return f(x);
}

writeln(dynamics(7, update));

这是可能的吗?有可以浏览的示例吗?

2个回答

6

Chapel拥有一等函数(first-class functions)。它们仍在不断发展,但同时也已经被成功使用(细节我不太清楚)。

如果您删除:?或将函数类型指定为func(int(32), int(32)),则示例将正常工作:

proc dynamics(x: int(32), f) // 或 proc dynamics(x: int(32), f: func(int(32), int(32)))


1
函数对象是一种合理的替代一等函数的选择 - 创建一个记录并为其定义proc this(args)myRecord(args)将调用它。 - mppf

1
同样的意图也可以通过传递一个“lambdified”回调函数来实现,可能需要使用ALAP-关联映射的回调包装器。
var f = lambda(n:int){ return -2 * n;};
writeln( f( 123 ) );                                        // lambda --> -246

proc update( x: int(32) ) {                                 // Brian's wish
  return 2*x;
}

proc dynamics( x: int(32), f ) {                            // Vass' solution
  return f( x );
}
// ---------------------------------------------------------------------------    
writeln( dynamics( 7, f ) );                                // proof-of-work [PASS] --> -14

var A = [ lambda( n:int ){ return 10 * n; },                // associatively mapped lambdified-"callbacks"
          lambda( n:int ){ return 20 * n; },
          lambda( n:int ){ return 30 * n; }
          ];
// ---------------------------------------------------------------------------    
writeln( dynamics( 8, lambda(i:int){ return    f(i); } ) ); // proof-of-work [PASS] --> -16
writeln( dynamics( 8, lambda(i:int){ return A[1](i); } ) ); // proof-of-work [PASS] -->  80
// ---------------------------------------------------------------------------
forall funIDX in 1..3 do
       writeln( dynamics( 8, A[funIDX] ) );                 // proof-of-work [PASS] -->  80 | 160 | 240

整个TiO.run在线IDE的模型代码在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接