Как сделать "указатели на функции" в Rascal?
Поддерживает ли Rascal указатели на функции или что-то в этом роде, например Java Interfaces?
По сути, я хочу извлечь конкретную (изменяющуюся) логику из общего логического блока в виде отдельных функций. Используемая функция передается в общий блок, который затем вызывает эту функцию. В C мы можем сделать это с помощью указателей на функции или с помощью интерфейсов в Java.
Сначала я хочу узнать, как эта общая концепция называется в мире языкового дизайна.
Я проверил вспомогательную функцию Rascal, но это не дает разъяснений по этому аспекту.
Так, например, у меня есть:
int getValue(str input) {
.... }
int getValue2(str input){
... }
Теперь я хочу сказать:
WhatDatatype? func = getValue2; // how to do this?
Теперь я могу передать это другой функции, а затем:
int val = invoke_function(func,"Hello"); // how to invoke?, and pass parameters and get ret value
Tx,
Jos
1 ответ
На этой странице в уроке есть пример использования функций высшего порядка, которые являются функцией Rascal, наиболее близкой к указателям на функции:
http://tutor.rascal-mpl.org/Rascal/Rascal.html
Вы можете определить анонимные (безымянные) функции, называемые замыканиями в Java; назначить их переменным; передать их в качестве аргументов функциям (функциям высшего порядка); и т.д. Вот пример:
rascal>myfun = int(int x) { return x + 1; };
int (int): int (int);
rascal>myfun;
int (int): int (int);
rascal>myfun(3);
int: 4
rascal>int applyIntFun(int(int) f, int x) { return f(x); }
int (int (int), int): int applyIntFun(int (int), int);
rascal>applyIntFun(myfun,10);
int: 11
Первая команда определяет функцию приращения, int(int x) { return x + 1; }
и назначает это переменной myfun
, Остальная часть кода будет работать так же, если бы это было
int myfun(int x) { return x + 1; }
Вторая команда просто показывает тип, который является функцией, которая принимает и возвращает int
, Третья команда вызывает функцию со значением 3
, возвращаясь 4
, Затем четвертая команда показывает функцию, которая принимает функцию в качестве параметра. Этот параметр функции, f
будет вызываться с аргументом x
, Последняя команда просто показывает пример ее использования.