2014-12-06 1 views
1

Неужели Rascal поддерживает указатели на функции или что-то в этом роде, как Java-интерфейсы?Как сделать «указатели на функции» в Rascal?

По сути, я хочу выделить конкретную (изменяющуюся) логику из общего логического блока в качестве отдельных функций. Используемая функция передается в общий блок, который затем вызывает эту функцию. В C мы можем сделать это с помощью указателей функций или с интерфейсами в Java.

Прежде всего, я хочу знать, как эта общая концепция называется в мире дизайна языков.

Я проверил страницу справки о функции мошенника, но это не дает разъяснений по этому аспекту.

Так, например, У меня есть:

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

ответ

2

Эта страница на репетиторе имеет п пример использования функций высшего порядка, которые являются особенностью Rascal ближе функционировать указатели:

http://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Concepts/Functions/Functions.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. Последняя команда просто показывает пример ее использования.

+0

Спасибо, что я искал. верхний – robert