2014-12-08 196 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