#:g1: tinyclosの紹介

Posted 2014-09-03 13:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の246日目です。

tinyclosとはなにか

 tinyclosは、Gregor Kiczales氏作のTiny CLOSをChicken用に変更を加えたものです。

パッケージ情報

パッケージ名tinyclos
Chicken eggs:TinyCLOS - The Chicken Scheme wiki

インストール方法

$ sudo chicken-install tinyclos

すれば、

(use tinyclos)

(require-extension tinyclos)

試してみる

 素のTiny CLOSの部分を残しているためか、随分と使いづらい印象です。
スロットの初期化を初めとしてよくある便利機能が提供されていないようですが、MOPを使って書きましょうというところなのでしょうか。
とはいえ、Chickenの推奨は、前回紹介したcoopsとのことなので、こちらは充実させる気はないのかもしれません。

 ということで今回もBankAccountで比較です。

(define-class <bank-account> ()
  (dollars))

(define-generic dollars) (define-generic set-dollars) (define-generic deposit) (define-generic withdraw) (define-generic num-shares) (define-generic price-per-share)

(define-method (initialize (a <bank-account>) initargs) (initialize-slots a initargs))

(define-method (dollars (a <bank-account>)) (slot-ref a 'dollars))

(define-method (set-dollars (a <bank-account>) (i <integer>)) (slot-set! a 'dollars i))

(define-method (deposit (a <bank-account>) (i <integer>)) (set-dollars a (+ i (dollars a))) (dollars a))

(define-method (withdraw (a <bank-account>) (i <integer>)) (set-dollars a (max 0 (- (dollars a) i))) (dollars a))

(define *my-account* (make <bank-account> 'dollars 200))

(dollars *my-account*) ;=> 200

(deposit *my-account* 50) ;=> 250

(withdraw *my-account* 100) ;=> 150 (withdraw *my-account* 200) ;=> 0

(define-class <stock-account> (<bank-account>) (num-shares price-per-share))

(define-method (initialize (a <stock-account>) initargs) (initialize-slots a initargs))

(define-method (set-dollars (a <stock-account>) (i <integer>)) (slot-set! a 'num-shares (/ i (slot-ref a 'price-per-share))) (dollars a))

(define-method (dollars (a <stock-account>)) (* (slot-ref a 'num-shares) (slot-ref a 'price-per-share)))

(define-method (num-shares (a <stock-account>)) (slot-ref a 'num-shares))

(define *my-stock* (make <stock-account> 'num-shares 10 'price-per-share 30))

(dollars *my-stock*) ;=> 300

(set-dollars *my-stock* 600) ;=> 600

(deposit *my-stock* 60) ;=> 660

(num-shares *my-stock*) ;=> 22

(withdraw *my-stock* 120) ;=> 540

(num-shares *my-stock*) ;=> 18

 やはり一連の便利メソッドが定義されていないと書くのが面倒臭いです。

まとめ

 今回は、tinyclosを紹介してみました。
Tiny CLOS系のオブジェクト指向システムが利用できるScheme処理系はそれなりにありますが、作法が処理系ごとに結構違っていますね。

comments powered by Disqus