- 论坛徽章:
- 1
|
本帖最后由 Lispor 于 2010-11-30 23:39 编辑
加载 goops 模块:- guile> (use-modules (oop goops))
复制代码 让我们先看几个例子:
1. 重载 + 函数, 以使字符串可以相加, 结果为字符串的顺序组合:- guile> (define-method (+ (x <string>) (y <string>))
- ... (string-append x y))
- guile> (+ "abc" "def")
- "abcdef"
- guile> (+ "abc" "123" "def")
- "abc123def"
复制代码 2. 类型定义- guile> (define-class <2d-vector> ()
- ... (x #:init-value 0 #:accessor x #:init-keyword #:x)
- ... (y #:init-value 0 #:accessor y #:init-keyword #:y))
复制代码 这样我们就定义了一个数学中二维向量, 其中有两个属性: x 和 y.
3. 对象生成
可以用 make 来创建一个二维向量:- guile> (define v1 (make <2d-vector>)) ; x, y 被设为默认值 (0, 0)
- guile> (define v2 (make <2d-vector> #:x 1 #:y 2)) ; x, y 被设为 (1, 2)
- guile> v1
- #<<2d-vector> b75fe9e0>
- guile> v2
- #<<2d-vector> b75fde80>
复制代码 4. 对象属性
可以访问和改变对象的 x 和 y 的值:- guile> (x v1)
- 0
- guile> (y v1)
- 0
- guile> (x v2)
- 1
- guile> (y v2)
- 2
- guile> (set! (x v1) 3)
- guile> (set! (y v1) 4)
- guile> (x v1)
- 3
- guile> (y v1)
- 4
复制代码 5. 重载函数
可以重载 +, 以使向量相加:- guile> (define-method (+ (v1 <2d-vector>) (v2 <2d-vector>))
- ... (make <2d-vector>
- ... #:x (+ (x v1) (x v2))
- ... #:y (+ (y v1) (y v2))))
- guile> (define v3 (+ v1 v2))
- guile> (x v3)
- 4
- guile> (y v3)
- 6
复制代码 6. 判断类型
可以得到一个对象的类型, 或者判断一个对象是否属于某个类型:- guile> (class-of v1)
- #<<class> <2d-vector> b75fdc30>
- guile> (class-of 1)
- #<<class> <integer> b760ec30>
- guile> (is-a? v1 <2d-vector>)
- #t
复制代码 |
|