免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3868 | 回复: 1
打印 上一主题 下一主题

Guile Scheme 之 GOOPS [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-29 22:35 |只看该作者 |倒序浏览
本帖最后由 Lispor 于 2010-11-29 22:39 编辑

GOOPS(Guile Object-Oriented Programming System)
Guile 的一个面向对象系统扩展模块, 类似于 CLOS(Common Lisp Object System), 适用于 scheme 环境.

GOOPS文档: goops manual

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-11-29 22:37 |只看该作者
本帖最后由 Lispor 于 2010-11-30 23:39 编辑

加载 goops 模块:
  1. guile> (use-modules (oop goops))
复制代码
让我们先看几个例子:

1. 重载 + 函数, 以使字符串可以相加, 结果为字符串的顺序组合:
  1. guile> (define-method (+ (x <string>) (y <string>))
  2. ...        (string-append x y))
  3. guile> (+ "abc" "def")
  4. "abcdef"
  5. guile> (+ "abc" "123" "def")
  6. "abc123def"
复制代码
2. 类型定义
  1. guile> (define-class <2d-vector> ()
  2. ...        (x #:init-value 0 #:accessor x #:init-keyword #:x)
  3. ...        (y #:init-value 0 #:accessor y #:init-keyword #:y))
复制代码
这样我们就定义了一个数学中二维向量, 其中有两个属性: x 和 y.

3. 对象生成
可以用 make 来创建一个二维向量:
  1. guile> (define v1 (make <2d-vector>))               ; x, y 被设为默认值 (0, 0)
  2. guile> (define v2 (make <2d-vector> #:x 1 #:y 2))   ; x, y 被设为 (1, 2)
  3. guile> v1
  4. #<<2d-vector> b75fe9e0>
  5. guile> v2
  6. #<<2d-vector> b75fde80>
复制代码
4. 对象属性
可以访问和改变对象的 x 和 y 的值:
  1. guile> (x v1)
  2. 0
  3. guile> (y v1)
  4. 0
  5. guile> (x v2)
  6. 1
  7. guile> (y v2)
  8. 2
  9. guile> (set! (x v1) 3)
  10. guile> (set! (y v1) 4)
  11. guile> (x v1)
  12. 3
  13. guile> (y v1)
  14. 4
复制代码
5. 重载函数
可以重载 +, 以使向量相加:
  1. guile> (define-method (+ (v1 <2d-vector>) (v2 <2d-vector>))
  2. ...        (make <2d-vector>
  3. ...              #:x (+ (x v1) (x v2))
  4. ...              #:y (+ (y v1) (y v2))))

  5. guile> (define v3 (+ v1 v2))
  6. guile> (x v3)
  7. 4
  8. guile> (y v3)
  9. 6
复制代码
6. 判断类型
可以得到一个对象的类型, 或者判断一个对象是否属于某个类型:
  1. guile> (class-of v1)
  2. #<<class> <2d-vector> b75fdc30>
  3. guile> (class-of 1)
  4. #<<class> <integer> b760ec30>
  5. guile> (is-a? v1 <2d-vector>)
  6. #t
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP