#:g1: yasosの紹介

Posted 2014-09-07 02:45:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の250日目です。

yasosとはなにか

 yasosは、Kenneth Dickey氏のyasosをJuergen Lorenz氏がChickenで動くようにしたものです。

パッケージ情報

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

インストール方法

$ sudo chicken-install yasos

すれば、

(use yasos)

(require-extension yasos)

試してみる

 yasosについては、Ken Dickey氏のScheming with Objectsに詳しいですが、クロージャーをオブジェクトとし、それに継承を加えてオブジェクト指向システムを構成したものです。

仕組みとしては非常にシンプルなので、これを読んだ人は自作してみたくなるかもしれません。

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

(define-predicate bank-account?)

(define-operation (dollars a))

(define-operation (set-dollars! a i))

(define-operation (deposit! a i))

(define-operation (withdraw! a i))

(define (make-bank-account #!key (the-dollars 0)) (object ((bank-account? self) #t)

((dollars self) the-dollars)

((set-dollars! self i) (set! the-dollars i) (dollars self))

((deposit! self i) (set-dollars! self (+ (dollars self) i)))

((withdraw! self i) (set-dollars! self (max 0 (- (dollars self) i))))))

(define *my-account* (make-bank-account the-dollars: 200))

(bank-account? *my-account*) ;=> #t

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

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

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

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

(define-predicate stock-account?)

(define-operation (num-shares a))

(define-operation (price-per-share a))

(define (make-stock-account #!key (the-dollars 0) (the-num-shares 0) (the-price-per-share 30)) (object-with-ancestors ((ba (make-bank-account the-dollars: the-dollars)))

((stock-account? self) #t)

((dollars self) (* the-num-shares the-price-per-share))

((set-dollars! self i) (set! the-num-shares (/ i the-price-per-share)) (dollars self))

((num-shares self) the-num-shares)

((price-per-share self) the-price-per-share)))

(define *my-stock* (make-stock-account the-num-shares: 10))

(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

 仕組みもシンプルで書法もシンプルです。
the-と付いているのは、名前の衝突を回避するためで、この辺はSchemeらしいといえばSchemeらしい気がします。

まとめ

 今回は、yasosを紹介してみました。
Chicken以外の処理系では、SLIB経由で導入することが多いようですが、SLIBが使えない場合でも全体で150行足らずなので移植するのは難しくなさそうです。

comments powered by Disqus