vieweditattachhistoryswikistopchangessearchhelp

CLOS

Common Lisp Object System

CommonLispの他、Schemeの多くの処理系で採用されているオブジェクト指向システム。
(言語のコアに手を入れずにこういうものを追加できてしまうのがLispの強み。)--SHIMADA


関連:



副作用を伴うオブジェクト指向と疑似関数プログラミングの相性

何も調べずにたた漠然と思っているだけなのですが、LISP(疑似関数プログラミング)と オブジェクト指向 ってのは相性は悪くないのでしょうか?--sumim

HashedWiki:FP#関数型オブジェクト指向で同じ疑問にどなたかが答えてくれましたが、CLOSのオブジェクトは関数型のパラダイムではないそうです。
関数型では参照透明性が重視されますが、CLOSは副作用のある破壊的操作を使いまくりでしょう。--SHIMADA

あると便利に思う人がいるから(不都合はあるが可能なので)取り込む、といった広い意味でのシュガーのようなものなのですね。--sumim

TinyCLOSTutorial より --SHIMADA
メソッドが適用されるオブジェクトとしてどれかの引数が特別扱いされるということがないので、C++における"friend"と呼ばれる構造---一つのクラスの一つのオブジェクトに関して適用される関数であるにもかかわらず他のクラスのオブジェクトのプライベートな情報にアクセスできる---を持つ必要がない。
‥‥‥逆に欠点もある。メソッドは、一つの特定のクラスではなくクラスの組み合わせに属するので、メソッドの可視性を制御することがより難しく、また、C++における public/protected/privateの区別がメソッドには適用できないというものだ。


というのは
クラスの定義が
(defclass クラス名 (上位クラス...)
((スロット名1 :accessor アクセス関数名 :initform 初期値 :initarg 初期化引数名)

(スロット名2 :accessor アクセス関数名 :initform 初期値 :initarg 初期化引数名)

....))

とスロットを記述するだけ.
メソッドはクラス定義とは別に
(defmethod メソッド名 ((引数1 引数1の対象となるクラス)(引数2 引数2の対象となるクラス)...)
<定義>)

と定義し,
関数は通常の関数と同じく
(メソッド名 インスタンス1 インスタンス2...)

....という形式で呼び出すという事情から来るものです.--mu

身近なとろこに CLOS が

 Win で SELF を使うために入れてあった Cygwin ですが、結構、いろいろな処理系をワンタッチでインストールして使えるんですね(<何をいまさら…)。RubyPython、Guile (Scheme)、CLISP (Common Lisp) なんかさくっと入れられて楽しめます。CLOS というとなにか高価なパッケージ製品を買わないと利用できない大仰なもののように(勝手なイメージで)想像していて及び腰でしたが、CLISP でなら気軽に「お試し」ができてグッドです。Io で make 初体験も済ませたので、Gauche のインストールにもチャレンジして、次は TinyCLOS にトライしてみます(っても、CLOS とさして変わらないでしょうけど…)。--sumim

このページを編集 (2981 bytes)


Congratulations! 以下の 15 ページから参照されています。

This page has been visited 10842 times.