Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2006-09-27

勉強するよ.13

| 21:47 | 勉強するよ.13 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.13 - わだばLisperになる

Schemeの勉強.13

今日も、第12章の途中

うーん、この章で行っていることは、自前のオジェクトシステムを

構築しつつ、その仕組も一緒に学習しよう、ということなのか。

Gaucheにはオジェクトシステムがあるので、内容をそれで書き直し

てみれば良いのだろうか。

っていうか、MzScheme使って実習しろよ、ということになってしま

うのか。

いや、しかし、MzSchemeを使ってみたとしても、説明が濃縮され過

ぎていて良く分かんないから一緒かもしれない。

とりあえず、Gaucheで書いてみたが、例題の意図を汲み取れていな

いので、何がなんだか分からない模様に。

別々にしちゃったけど、クラスの中でメソッドが定義されているの

が醍醐味であり、別々に分けちゃいけないのかしら。

;; 12.1
;; クラスを定義
(define-class trivial-bike-class ()
  ((frame :init-keyword :frame)
   (size :init-keyword :size)
   (parts :init-keyword :parts)))

;; 確認
;(d trivial-bike-class)

;; インスタンスを作成
(define my-bike
  (make trivial-bike-class
    :frame 'cromoly
    :size '18.5
    :parts 'alivio))

;(d my-bike)
;=> gosh> (d my-bike)
;   #<trivial-bike-class 0x815f750> is 
;    an instance of class trivial-bike-class
;   slots:
;     frame     : cromoly
;     nsize      : 18.5
;    parts     : alivio


;; メソッドを含むクラス ってのが良く分からないというか、何が
;; どうなってるのか良く分からない。
;; define-classとdefine-methodで作ってみた。

;; クラスを定義
(define-class bike-class ()
  ((frame :init-keyword :frame :accessor frame-of)
   (size :init-keyword :size :accessor size-of)
   (parts :init-keyword :parts :accessor parts-of)
   (chain :init-keyword :chain :accessor chain-of)
   (tires :init-keyword :tires :accessor tires-of)))

;; 確認
;(d bike-class)

;; インスタンスの作成
(define my-bike
  (make bike-class
    :frame 'titanium ; I wish
    :size 21
    :parts 'ultegra
    :chain 'sachs
    :tires 'continental))

;; 確認
; gosh> (d my-bike)
; #<bike-class 0x81713d0> is an instance of class bike-class
; slots:
;   frame     : titanium
;   size      : 21
;   parts     : ultegra
;   chain     : sachs
;   tires     : continental

;(size-of my-bike)
;=> 21

;; メソッドを定義
(define-method check-fit ((me bike-class) inseam)
  (let ((bike-size (size-of me))
	(ideal-size (* inseam 3/5)))
    (let ((diff (- bike-size ideal-size)))
      (cond ((<= -1 diff 1) 'perfect-fit)
	    ((<= -2 diff 2) 'fits-well)
	    ((< diff -2) 'too-small)
	    ((> diff 2) 'too-big)))))

; gosh> (check-fit my-bike 32)
; =>fits-well