md / lambda-preprocessor
0.1.0
2017-07-15 19:00 UTC
Requires
- pre/plugin: ^0.7.3
- yay/yay: ^0.2
Requires (Dev)
- phpunit/phpunit: ^6.2
This package is not auto-updated.
Last update: 2024-09-10 16:42:39 UTC
README
在Hacklang中,lambda 表达式是通过使用 lambda 箭头 ==>
表示的。箭头的左侧是匿名函数的参数,右侧是表达式或语句列表。
此预处理器旨在使这种语法在本地 PHP 应用程序中可用。这不会在运行时发生,因此不会影响性能。预处理器在pre 插件和yay 宏库之上工作。
语法上,由于 Yay 尚未具有表达式解析器,尽管 Hack 支持不使用花括号的单个表达式,但此预处理器始终需要编写花括号。希望 Yay 的发展将改变这一点。
单行匿名函数
最简单的例子是返回它最初给出的参数的匿名函数。在 PHP 中可以写成
$id = function($x) { return $x };
使用此预处理器可以写成更简单
$id = $x ==> { $x };
如果我们需要声明类型提示或传递多个参数,我们则需要使用括号。我们也可以在上面的示例中使用括号,但对于没有类型提示的单个参数来说是可选的。
$addNumbers = ($x, $y) ==> { $x + $y };
这可以翻译成
$addNumbers = function ($x, $y) { return $x + $y };
或者带有类型提示
$addNumbers = (int $x, int $y): int ==> { $x + $y };
这可以翻译成
$addNumbers = function (int $x, int $y): int { return $x + $y };
多行匿名函数
对于具有多行的匿名函数,参数、类型提示和返回类型的规则仍然适用。唯一的区别是您需要在块的最后一句话中写出 return
关键字,并且现在您必须在每个语句的末尾加上分号。
$increment = $x ==> { $y = $x + 1; return $y; };
这可以翻译成
$increment = function($x) { $y = $x + 1; return $y; };
闭包
PHP 提供了 use
关键字来捕获封闭作用域中的变量。Hack 的 lambda 使得这一点更加容易。您可以在 lambda 中隐式使用变量。当您使用此预处理器时,这将是可用的。
function addLastname(array $names, string $lastname): array { return array_map($name ==> { $name . " " . $lastname }, $names); }
请注意,为了使用 $lastname
与官方语法,您必须使用如以下所示的 use
关键字
function addLastname(array $names, string $lastname): array { return array_map(function($name) use ($lastname) { return $name . " " . $lastname }, $names); }
递归调用和优先级
预处理器将首先翻译内部块,然后是外部块。与此语法相比,优先级更为明显。在 Hack 中,您可以省略花括号 {
和 }
。在这里,很明显表达式
$lambda = $x ==> { $y ==> { $x + $y }; };
将被翻译成
$lambda = function($x) { return function($y) { return $x + $y; }; };
总结
- 此预处理器是 alpha 软件。请勿在生产环境中使用。