В следующем коде я пытаюсь создать «указатель функции» и массив функций, рассматривая имена функций как обычные переменные:
proc myfunc1() { return 100; }
proc myfunc2() { return 200; }
// a function variable?
var myfunc = myfunc1;
writeln( myfunc() );
myfunc = myfunc2;
writeln( myfunc() );
// an array of functions?
var myfuncs: [1..2] myfunc1.type;
writeln( myfuncs.type: string );
myfuncs[ 1 ] = myfunc1;
myfuncs[ 2 ] = myfunc2;
for fun in myfuncs do
writeln( fun() );
который, кажется, работает как положено (с Chapel v1.16)
100
200
[domain(1,int(64),false)] chpl__fcf_type_void_int64_t
100
200
Итак, мне интересно, законно ли вышеуказанное использование функциональных переменных? Для создания массива функций обычно сначала определяют конкретную функцию с желаемой сигнатурой, а затем ссылаются на ее тип (с помощью .type
), как в приведенном выше примере?
Кроме того, не проблема ли рассматривать такие переменные как «обычные» переменные, например, передавать их другим функциям в качестве аргументов или включать их как поле класса/записи? (Пожалуйста, игнорируйте эти последние вопросы, если они слишком широки...) Я был бы признателен за любые советы, если есть потенциальные ловушки (если таковые имеются).