2014-12-08 193 views
1

我正在重寫PHP類型系統並致力於實現更純粹的語言。我儘可能地將純粹主義視爲功能性和麪向對象的語言,如方法鏈,類型爲對象,消息傳遞,條件方法和其他一些功能http://github.com/haskellcamargo/rawr。在這裏,函數將是Func類的實例,之後我將爲它做一個反編譯器,因爲PHP已經走到了盡頭。 Func不會限制到一元函數的參數,但會檢查是否被調用時,參數的數目相匹配正是預期參數的數量:第一類函數的函數構造

$add = Func(function(Number $x) { 
    return Func(function(Number $y) use ($x) { 
    return $x -> add ($y); 
    }); 
}); 

附加在哪裏將是一個功能,我不需要控制自己的身份,儘管它是一元的,並通過咖啡的作品。但是當我使用接收多個參數的函數時,我的問題就出現了。讓我們爲例如一個簡單的功能,在屏幕上輸出一個名字:

$say_name = Func(function(String $name) { 
    $name -> outputln(); 
}); 

$say_name需要1唯一的參數,但我怎麼能斷言,它將獲得ñ參數,是ñ的元數這個匿名函數?

$say_name -> invoke("Test");可能工作,但$say_name -> invoke("Test", 1);也有效,因爲我沒有辦法知道匿名函數的arity。

function() { return func_num_args(); }

這將返回傳遞給它的參數的個數。我需要知道的所需參數數量x,是這樣的:

function x(Int $i, Functor $j) { return a_magic_function_that_returns_it_all(); }

和輸出我像array(2) { [0]=> Int [1]=> Functor }。有人可以幫助我嗎?

回答

1

解決與ReflectionFunction用法:

$add = function($x, $y) { return $x + $y; }; 
$x = new ReflectionFunction($add); 
$args = $x->getParameters(); 
var_dump(count($args)); // 2