Hack将功能完全命名为一等公民吗?

时间:2016-05-12 13:07:40

标签: hhvm hacklang first-class-functions

HHVM 3.9不是具有命名函数的三元语句的粉丝,即使通过fun()传递,但≥3.10对它们完全没问题。看起来好像这是少数几种情况之一,因为3.9 接受从具体函数返回的命名函数,以及接受传递给其他函数的命名函数(3v4l):< / p>

<?hh
echo ((() ==> fun('strlen'))())('Hello'); // 5
echo (($f, $v) ==> $f($v))(strlen, 'Hello'); // 5 + Notice: Use of undefined constant strlen - assumed 'strlen'
echo (true ? strlen : intval)('100'); // Fatal error: syntax error, unexpected '(', expecting ',' or ';' on line 3

3.9和3.10之间有什么变化?在HHVM≥3.10中是否存在无法以这种方式引用和使用命名函数的情况?

1 个答案:

答案 0 :(得分:1)

首先,编写Hack时,don't write your code at toplevel; the hh_client typechecker can't check anything at toplevel。并且3v4l根本没有运行类型检查器,你需要在本地运行它。

那就是说,不,哈克真的没有一流的功能。它的大多数行为都是从PHP继承而来的,它也没有它们。当我在Hack团队工作时,我们抛出了许多想法,将它们添加到语言中;这是一个明显的补充和需求。但是,需要从来没有相当足够强大,以至于我们坐下来并实际计算出类型系统和运行时影响的细节;特别是,如何解决当前callables所具有的一些范围问题。匿名函数填写了足够的需求,特别是对于Hack's short lambda syntax,总有一些事情需要处理。

所以Hack只有PHP的正常可调用形式; fun is one of a few special functions which give information to the typechecker that the string you specified actually represents a function所以typechecker可以进行适当的类型分析。但是在一天结束的时候,fun只是归结为通常的PHP可调用形式,并且在类型搜索器中有一些额外的魔法。

至于您在3v4l链接中指明的行为。像这样使用strlenintval会导致Hack中出现类型错误,因为这些是语法常量,但由于Hack没有一流的函数,所以这些名称的常量不存在 - 或者如果代码没有在顶层并且你正在运行类型检查器的话。至于为什么它会导致HHVM 3.9中的解析错误(掩盖&#34;无效常数&#34;你在3.10中看到的错误),我不是100%肯定。从this example判断,它适用于PHP7和HHVM 3.10,而不是PHP5和HHVM 3.9,我的猜测是PHP7 feature that is backwards compatible and so is always enabled in HHVM