文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.2 Scheme 中的(第一种)简单对象系统
我们可以用宏在 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 技术交流群。

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