宝石猫 / lisp-signals
Lisp风格的信号、条件和重启
Requires
- php: ^5.6 || ^7.0
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。如果它坏了,你可以保留这些碎片。