stan-dev / stanc3

The Stan transpiler (from Stan to C++ and beyond).
BSD 3-Clause "New" or "Revised" License
138 stars 44 forks source link

[FR] UDFs taking another UDF as argument #1325

Open andrjohns opened 1 year ago

andrjohns commented 1 year ago

A bit of a nice-to-have for simplifying more complex models would be the ability to pass a functions as an argument to another function.

With suggested signatures like:

functions {
  real mult(int x, real y) { return x * y; }
  real div(int x, real y) { return x / y; }

  real calc((int, real): real functor, int x, real y) {
    return functor(x, y);
  }
}

And usage:

int a = 1;
real b = 2;

real calc_mult = calc(mult, a, b);
real calc_div = calc(div, a, b);

And if it's not too tricky an additional request, being able to declare/assign functions would be great as well:

(int, real): real functor;

if (operation == 1) {
  functor = mult;
} else {
  functor = div;
}

real result = calc(functor, a, b);

Note that the above is a highly contrived and simplified example

WardBrian commented 1 year ago

I think this is definitely something we want to work on after Tuples. Some of this was part of #742 if I understand correctly, so reviving or reworking that effort would be a good start down the line

See also: https://github.com/stan-dev/design-docs/blob/master/designs/0004-closures-fun-types.md