CLでSRFI-57 — #:g1

Posted 2012-05-24 14:04:00 GMT

CLでSRFI、今回は、SRFI-57の「Records」です。
SRFI-9に継承の機能と総称関数的なものを加えたようなものです

動作

(define-record-type  point (make-point x y) point?
  (x get-x set-x!)
  (y get-y set-y!))

(define-record-scheme <point nil <point? (x <point.x) (y <point.y))

(define-record-scheme <color nil <color? (hue <color.hue))

(define-record-type (point <point) make-point point? (x point.x) (y point.y))

(define-record-type (color <color) make-color)

(define-record-type (color-point <color <point) (make-color-point x y hue) color-point? (info color-point.info))

(defparameter *p* (point (x 1) (y 2)))

(point.x (record-update *p* point (x 7))) ;=> 7

(point.x *p*) ;=> 1

(defparameter *cp* (color-point (hue 'blue) (x 1) (y 2)))

(show (record-update *cp* <point (x 7))) ;=> (COLOR-POINT (INFO SRFI-57.INTERNAL::<UNDEFINED>) (HUE BLUE) (X 7) (Y 2))

(show *cp*) ;=> (COLOR-POINT (INFO SRFI-57.INTERNAL::<UNDEFINED>) (HUE BLUE) (X 1) (Y 2))

移植について

マクロがえらいややこしいのですが、関数定義とマクロ展開のタイミングがか移植したものでは噛み合っておらず、謎の挙動をしたりします。
ややこしすぎるので気が向いたら直してみたいです。
総称関数的なものを導入するSRFIはいまいち微妙な気がしています…。

comments powered by Disqus