宝石猫/lisp-signals

Lisp风格的信号、条件和重启

v0.9.0 2016-08-07 21:08 UTC

This package is auto-updated.

Last update: 2024-09-21 09:36:14 UTC


README

一个受Common Lisp和Peter Seibel启发的信号/条件/重启系统。

这是什么意思!

在大多数语言中,包括PHP,异常是在低级别抛出,并在调用栈的更高级别捕获。当它被捕获时,执行已经离开了低级别,无法返回。

在Common Lisp中,等效的概念是发送一个信号,并由信号处理函数处理。但是,还有一个第三部分,重启,可以在任何级别注册。信号处理函数可以选择任何重启来调用,并且执行将从中断处继续,即使它低于信号处理函数注册的级别。

最简单的例子在appDoesNothing.php示例中实现,使用common.inc.php中定义的内容。所有示例都遵循《实用Common Lisp》第19章中日志解析示例。

我是一个lisper,PHP中是如何实现的呢?

重启是一个特殊的异常类,它被抛出,声明重启实际上是在编写try/catch块并告诉Signal类重启存在。低级代码向下调用信号处理相关的内容来发送错误或其他条件,以便栈保持完整。

我对Common Lisp的设计又多了一个自由:信号名称实际上是发送的信号对象的类名。所以一个error实际上是一个Sapphirecat\Signal\Error实例。这允许信号携带尽可能多的数据,并为它提供行为,所有这些都通过信号系统(和处理函数)的单个参数完成。

在这个库中,通过Signal::receive()绑定信号处理程序,通过Signal::send()发送信号,通过Signal::restart()声明活动的重启。条件是SignalInterface,而重启实际上是通过抛出BaseRestart来调用的。

错误和警告协议分别通过Signal::error()Signal::warning()(使用Silence重启)实现。最后,可以继承内置的Error条件,并通过Signal::sendError()发送。

(我希望这个术语是准确的。我已经有一段时间没有深入研究Lisp了。)

安装

从composer获取

composer require sapphirecat/lisp-signals "~0.9.0"

或者,将此存储库顶级目录中的autoload.php包含进来,并享受。

许可证

2-clause BSD。如果它坏了,你可以保留这些碎片。