#:g1: Allegro CL: Flavorsの紹介

Posted 2014-08-27 14:50:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の239日目です。

Allegro CL: Flavorsとはなにか

 Allegro CL: Flavorsは、Allegro CLのFlavorsの実装です。

パッケージ情報

パッケージ名Allegro CL: Flavors
ドキュメントFlavors
Quicklisp×

インストール方法

 Allegro CL上で

(require :flavors)

とすれば利用可能です。

試してみる

 毎度お馴染のBankAccountです。

 Spice LispのFlavorsと全く同じコードも動きますが、(send self ...)が(send-self ...)と書けたりするので、そちらを使ってみています。

(require :flavors)

(defpackage :allegroflavors.demo (:use :cl :flavors) (:shadowing-import-from :flavors :defmethod :make-instance))

(cl:in-package :allegroflavors.demo)

(defflavor bank-account ((dollars 0)) () :initable-instance-variables :gettable-instance-variables :settable-instance-variables)

(defmethod (bank-account :deposit) (x) (send-self :set-dollars (+ (send self :dollars) x)))

(defmethod (bank-account :withdraw) (x) (send-self :set-dollars (max 0 (- (send self :dollars) x))))

(defparameter *my-account* (make-instance 'bank-account :dollars 200))

(send *my-account* :dollars) ;=> 200 (send *my-account* :deposit 50) ;=> 250 (send *my-account* :withdraw 100) ;=> 150 (send *my-account* :withdraw 200) ;=> 0

(defflavor stock-account ((num-shares 0) (price-per-share 30)) (bank-account) :initable-instance-variables :gettable-instance-variables :settable-instance-variables)

(defmethod (stock-account :set-dollars) (x) (setq num-shares (/ x price-per-share)) (send-self :dollars))

(defmethod (stock-account :dollars) () (* num-shares price-per-share))

(defparameter *my-stock* (make-instance 'stock-account :num-shares 10))

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

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

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

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

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

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

まとめ

 今回は、Allegro CL: Flavorsを紹介してみました。
Allegro CLでは、過去のコードとの互換性の為に用意しているようですが、それもなかなか凄いような気がします。
Flavorsも実装が色々あり、Flanz LispもFlavorsはMITのLispマシンからの移植版が利用できたようです。もしかしたら、それが受け継がれているのかなと思い、パッケージ内のシンボルを眺めてみましたが、どうも結構MITのFlavorsとは違っているようなので、Allegro CLでは独自の実装となったのかもしれません。

comments powered by Disqus