この章ではLispによるオブジェクト指向プログラミングについて論じる. Common Lispにはオブジェクト指向のプログラムを書くためのオペレータが揃っている. それらをまとめて,Common Lisp Object System,またはCLOSと呼ぶ. ここではCLOSを単にオブジェクト指向のプログラムを書く一手段としてではなく, Lispプログラムそのものとして捉える. CLOSをこの観点から眺めることがLispとオブジェクト指向プログラミングとの関係を理解する鍵となる. Plus ça Change オブジェクト指向プログラミングとはプログラムの構成の変化を指す. その変化はプロセッサの処理能力の分布について起こったものと似ている. 1970年,「マルチユーザのコンピュータシステム」と言えば 一つか二つの大型メインフレームが多数のダム端末に接続されたものを指していた. 今では多数の
1. Introduction This document was written for presentation during a tutorial session at the International Lisp Conference held in New York City in October 2003. The intended audience for the tutorial is anybody with a basic knowledge of lisp or scheme, who wants to know something about how to use the "Common Lisp Object System" (CLOS). However, in an attempt to provide something for everyone, the
Jeff Dalton <J.Dalton@ed.ac.uk> Contents: Introduction Defining classes Instances Inheritance of slot options Multiple inheritance Generic functions and methods Method combination Introduction This is a brief introduction to CLOS that says enough for someone who already knows something about Common Lisp to start using CLOS. CLOS stands for Common Lisp Object System and is pronounced "see loss" or
Common Lisp Object System(CLOS)に似たオブジェクトシステムをJavaScriptで使えるJS-CLOSの紹介です。 多重継承、多重ディスパッチ(総称関数)、インスタンス作成時の簡単な型チェックなどができます。 CLOSではオブジェクトは単なるスロットの集合で、メソッドはオブジェクトに属しません。メソッドに相当するのは総称関数です。 CLOSについての詳しい説明はwikipedia等を参照してください。 まずは小手調べ。MLやHaskellのパターンマッチみたいなことをしてみます。 fib = define_generic() define_method fib, [0], -> 0 define_method fib, [1], -> 1 define_method fib, ["number"], (n) -> fib(n - 1) + fib(n - 2)
null はオブジェクトでない † null は参照値 (reference value) なので == != による比較はできる。 しかし null はオブジェクトではない。そのため,いちいち if (obj == null) と条件判定をしなければならない。 これは,あたかも,ポリモルフィックなメソッドにおいて (クラスの違いによるディスパッチをせずに)instanceof による場合分けをするようなもので, コードの美しさを損なう→シンプルでなくなる→保守が困難になるという滝壺に落ちていく誘因となる。 純粋なオブジェクト指向プログラミングの観点からは, Null クラスに唯一のオブジェクト null が用意されている とすればよかっただろう。 いくつかのオブジェクト指向言語を比較すると,この方法が最も美しく感じられる。 Java でも同等なことができないことはない。たとえば stat
本当はこの記事は,これまでのCLOS で学ぶ集合論の一環なんですが,ちょっと内容がCLOS の話だけで集合論は出てきそうもないので,こういう内容にふさわしいタイトルにしました. 前のブログで,CLOS はLisp の型システムに統合されているという話をして,(find-class 't) とか(find-class 'integer) でCLOS の組込みクラスである built-in クラスの話をしました.正当なCLOSクラスではないそのほかのクラスとして構造体クラス(structure class) があります.Lisp の構造体はユーザが定義できますが,構造体を定義するときのオプションで :include を用いると,それが型の上下関係を定義したことになり,それがCLOSの構造体クラスの上下関係にもなっています. cg-user(3): (find-class 't) #<built
Common Lisp Object System(コモン リスプ オブジェクトシステム、略称 CLOS)は、ANSI Common Lisp (CL) の一部をなすオブジェクト指向プログラミング機能であり、他の言語(EuLisp や Emacs Lisp、Scheme、Dylan)にも類似のシステムが導入されている[1]。1984年のCommon Lisp仕様ではオブジェクト指向システムは時期尚早として組み込まれなかったが、1994年のANSI標準では組み込み機能となった。CLOS は強い型付けをもつ動的(実行時に定義を変更できる)オブジェクトシステムであり、C++やJavaのような静的なオブジェクト指向言語とは大きく異なる。1970年代に始まる初期のLISPオブジェクトシステム(MIT Flavors や LOOPS)に影響されているが、より汎用的である。 LISPにオブジェクト指向を
総称関数の練習のために、Fizz-Buzz問題を総称関数を使って解いてみた。独自のメソッド結合まで使った、無駄に大掛かりな物になっている。 (defun strcat (&rest strings) (apply 'concatenate `(string ,@strings))) (define-method-combination strcat :identity-with-one-argument t) (defgeneric fizz-buzz-method (mod3 mod5) (:documentation "mod3が0ならFizz, mod5が0ならBuzz") (:method-combination strcat)) (defmethod fizz-buzz-method strcat ((mod3 (eql 0)) mod5) "Fizz") (defmethod
多重ディスパッチ(英: Multiple dispatch)は、多重定義された関数やメソッド(マルチメソッド(英: Multimethods)などと呼ばれる)などについて、そこで呼び出されるべき1つの定義を動的に選んで実行する(動的ディスパッチする)際に、2個以上の複数の引数が関与してどれかひとつを選ぶこと(特殊化)がおこなわれるものである。 概要[編集] 多重定義を許すプログラミング言語では、同一の名前の(すなわち、多重定義された)関数やメソッドのうちのどれを呼出す(ディスパッチする)かを決定する、ということをしなければならない。 多くのオブジェクト指向プログラミング言語は単一ディスパッチである。すなわち、メソッド呼び出し(Smalltalkなら「メッセージ送信」、C++なら「メンバ関数呼び出し」)において、引数の1つが特別に扱われ、呼び出すべきメソッドの特定に使われる。構文上もその引数
->English 10/5/2001 初出 5/30/2002 追記 6/10/2002 英語版へのリンク追加 「プログラミング言語は満載した機能を特色の第一とするものではない。 あとになって機能の追加が必要と判明するような弱点と制限を取り除いて設計すべきである。」 (アルゴリズム言語Schemeに関する第五改訂報告書、犬飼 大訳 [1])。 言語の機能とライブラリ ポピュラーな言語に親しんできたプログラマの多くは、 Schemeに触れた時、こう感じるんじゃないか。 「一体こんなに機能の少ない言語で、どんなプログラムが書けるっていうんだ。」 Schemeの規格書はほんの50ページしか無い。 Schemeプログラマはそれを言語の簡潔さの証とかなんとか言ってるけど、 入出力は最低限のものしかないし、作ったファイルを消すことさえ出来ない。 文字列処理もC言語の標準ライブラリ以下じゃないか。 ス
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く