Как сделать "указатели на функции" в 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, Последняя команда просто показывает пример ее использования.

Другие вопросы по тегам