2014-12-06 60 views
1

Rascal是否支持函數指針或類似的東西來做到這一點像Java接口?如何在Rascal中做'函數指針'?

本質上,我想從一個公共邏輯塊中提取特定(更改)的邏輯作爲單獨的功能。被使用的函數被傳遞給公共塊,然後調用這個函數。在C中,我們可以用函數指針或Java中的Interfaces來完成。

首先,我想知道在語言設計領域如何調用這個一般概念。

我檢查了Rascal函數Helppage,但是在這方面沒有提供任何說明。

因此,例如,我有:

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,

喬斯

回答

2

導師說的這個頁面有一個N實施例使用高階函數,這是流氓特徵的最接近函數指針:

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。第四個命令然後顯示一個函數,它將一個函數作爲參數。然後將使用參數x調用此函數參數f。最後的命令只是顯示了一個使用它的例子。

+0

感謝這就是我一直在尋找。最佳 – robert 2014-12-06 19:44:18