文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.5 错误处理
让我们看看,如果发送消息给不知道如何处理它的对象会发生什么:
> (let ([l (make-leaf 2)])
(-> l print))
cdr: contract violation
expected: pair?
given: #f
这个错误信息很糟糕——它将我们的实现策略暴露给程序员,而且没有提示问题在哪。
我们可以改变 OBJECT 语法抽象的定义,正确地处理未知消息:
(defmac (OBJECT ([field fname init] ...)
([method mname args body] ...))
#:keywords field method
(let ([fname init] ...)
(let ([methods (list (cons 'mname (λ args body)) ...)])
(λ (msg . vals)
(let ([found (assoc msg methods)])
(if found
(apply (cdr found) vals)
(error "message not understood:" msg))))))) ;未知的消息
我们不再假设在对象的方法表中会有消息关联的方法,而是首先查找并将结果绑定到 found;如果找不到方法,found 将会是#f。在这种情况下,我们给出有意义的错误信息。
确实好多了:
> (let ([l (make-leaf 2)])
(-> l print))
message not understood: print
本章,我们成功地在 Scheme 中嵌入了一个简单的对象系统,它显示了词法作用域的一等函数和对象之间的连接。但是,我们还远没有完成,目前的对象系统仍然不完整且非常原始。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论