返回介绍

1.5 错误处理

发布于 2025-02-20 00:17:05 字数 1060 浏览 0 评论 0 收藏 0

让我们看看,如果发送消息给不知道如何处理它的对象会发生什么:

> (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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文