返回介绍

1.2 Scheme 中的(第一种)简单对象系统

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

我们可以用宏在 Scheme 中嵌入一个遵循上面确定的模式的简单对象系统。

请注意,在本书中我们使用 defmac 来定义宏。defmac 类似于 define-syntax-rule ,但是它还支持关键字参数,外加标识符捕获(通过 #:keywords#:captures 可选参数)。

(defmac (OBJECT ([field fname init] ...)
                ([method mname args body] ...))
  #:keywords field method
  (let ([fname init] ...)
    (let ([methods (list (cons 'mname (λ args body)) ...)])
      (λ (msg . vals)
        (apply (cdr (assoc msg methods)) vals)))))

我们还可以定义箭头 -> 符号表示发送消息给对象,例如 (-> st push 3)

(defmac (-> o m arg ...)
  (o 'm arg ...))

现在就可以使用这个对象系统来定义二维点对象了:

(define p2D
  (OBJECT
   ([field x 0]
    [field y 0])
   ([method x? () x]
    [method y? () y]
    [method x! (nx) (set! x nx)]
    [method y! (ny) (set! y ny)])))

这么使用:

> (-> p2D x! 15)
> (-> p2D y! 20)
> (-> p2D x?)
15
> (-> p2D y?)
20

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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