我正在重写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);
});
});
在哪里添加将是一个功能,我不需要控制它的arity,就像它是一元一样,并通过currying工作。但是当我处理接收多个参数的函数时,我的问题出现了。我们以一个在屏幕上输出名称的简单函数为例:
$say_name = Func(function(String $name) {
$name -> outputln();
});
$say_name
需要 1个唯一参数,但我怎么断言它会接收 n 参数, n 是arity这个匿名函数?
$say_name -> invoke("Test");
可能有用,但$say_name -> invoke("Test", 1);
也有效,因为我没有办法知道匿名函数的优点。
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 }
的内容。有人可以帮我吗?
答案 0 :(得分:1)
解决了ReflectionFunction
:
$add = function($x, $y) { return $x + $y; };
$x = new ReflectionFunction($add);
$args = $x->getParameters();
var_dump(count($args)); // 2