All articles in common-lisp

CLOS

CLOSとはCommon Lisp Object Systemの略らしい.OOというのはメソッドというしばしば破壊的な関数がバンバンでてきて,Lispとは相容れない世界かと思っていたのだが,そうではないようだ.クラス定義とインスタンンス化とスロットの参照メソッドスロット優先度総称関数スロットの継承補助メソッドオペレータメソッドコンビネーション総称関数の削除 クラス定義とインスタンンス化とスロットの参照 メソッド スロット クラスを定義する際に,スロットにいろいろな属性を付加することができる.:accessorslot-valueとは別にスロットを参照できる関数を暗黙に定義する.:reader:accessorは読み書きのためのアクセサ関数を定義するが,:readerは読み込み専用関数を暗黙に定義する.定義された関数の引数はインスタンスである.:write:accessorは読み書きのためのアクセサ関数を定義するが,:readerは書き込み専用関数を暗黙に定義する.定義された関数の第一引数は設定値,第二引数がインスタンスである.:initform該当スロットのデフォルト値を定義.:initargmake-instance時にスロットに初期値設定を行えるようにする.:initargの後には:で始まる識別子を指定して,make-instance時にはその識別子を介して値を設定する. (defclass clazz ()((slot :initarg :slotIni))) (slot-value (make-instance ‘clazz :slotIni 5) ‘slot)5:allocation引数に:classを指定すると,該当スロットはインスタンス間で共有される.つまり該当フスロットがいわゆるクラスフィールドとなる.:instanceはデフォルトで,つまりインスタンスフィールドである.:documentationスロットのドキュメント.:typeスロットの型を指定.以下にこれらのいくつかを使用する例を示す.(defclass hogefuga … More CLOS

多値

Common Lispでは関数は値を0個以上返す.これまでは主に1つの値を返す場合の記述をしてきた.本頁では0個の値を返す,つまり値を返さない場合や2個以上の値を返す場合について記述する.多値を返す多値を受け取る多値を他の関数に渡すmultiple-value-list 多値を返す 多値を返す関数としてvaluesがある.(values 値 値 値…)valuesは引数の値をすべて返す.以下に例を示す. (values 1 2 3)1 ;2 ;3このvaluesを関数の最後に実行すれば,多値を返す関数を作成することができる.以下は三つの引数をそのまま返す関数である.(defun hoge (a b c)(values a b c))HOGE … More 多値

文字列

Lispの文字列は値が文字のベクタとして表現され扱われるが,多くのプログラミング言語と同様,文字用の表記方法や文字列用の表記方法が用意されている.文字文字列文字列の比較文字列の大文字小文字変換文字列の連結部分文字列 文字 文字列 文字列の比較 文字列の大文字小文字変換 文字列の大文字小文字を変換するには以下の関数を使用する.string-upcase文字列に小文字があれば大文字に変換するstring-downcase文字列に大文字があれば小文字に変換するnstring-upcasestring-upcaseの破壊的関数nstring-downcasestring-downcaseの破壊的関数試してみる. (setf str “HoGe”)“HoGe”(string-upcase str)“HOGE”(string-downcase str)“hoge”(nstring-downcase str)“hoge”str“hoge”(nstring-upcase str)“HOGE”str“HOGE”破壊的関数の後は引数の値が破壊(大文字もしくは小文字に変換)されていることに注意. 文字列の連結 部分文字列

ハッシュ

Lispのハッシュを使ってみた.ハッシュの作成と値の取り出しレコードの設定削除キーの比較領域の拡張 ハッシュの作成と値の取り出し レコードの設定 削除 キーの比較 領域の拡張 ハッシュは領域が足りなくなったら自動的に領域を拡張する.これによりハッシュは好きなだけ要素を格納できる.ここで問題になるのは領域を拡張する際の大きさである.メモリ領域の確保はコストが大きいので,領域拡張回数は少ない方がよい.拡張回数を少なくするには拡張サイズを大きくする方法があるが,それだと無駄にメモリ領域を消費する危険がある.このトレードオフの問題はプログラマがチューニングして解決するしかないように思われる.試しに以下のサンプルを使用してキーワード引数sizeの効果を確認してみた.(setf hash (make-hash-table :size 10000))(setf str “HOGE”) (do ‘(i 0 (+ i 1))((> i … More ハッシュ

関数とクロージャ

Common Lispでの関数の詳細についていろいろと試してみた.関数の基本(setf 関数名)という関数名大域関数と局所関数関数のパラメータレキシカル変数と関数とクロージャ動的スコープ 関数の基本 (setf 関数名)という関数名 大域関数と局所関数 関数のパラメータ レキシカル変数と関数とクロージャ 動的スコープ

シンボルとパッケージ

Common Lispのシンボルには,いろいろな情報が格納されている.また,Common Lispにはパッケージというものがあって,これによってシンボルの名前空間を拡張できる.シンボルの構成シンボル名属性リストパッケージシンボルのインターンパッケージの定義と移動 シンボルの構成 シンボルは以下から構成される.シンボル名パッケージ変数値関数属性リストシンボルは簡単に作成できて,見ためも単なる文字列のように見えるが,内部では構造を持っていて,いろいろな情報を持っている. シンボル名 前節のとおり,シンボルは単なる名前ではなく実体を伴うオブジェクトである.人間はシンボル名を通して,シンボルを単なる名前として認識できる.シンボルのシンボル名はsymbol-nameによって参照できる. (symbol-name ‘SYMBOL)“SYMBOL”(symbol-name ‘Symbol)“SYMBOL”(symbol-name ‘symbol)“SYMBOL”特に指定しない限り,シンボルに大文字小文字の区別はない.空白や(や)などをシンボル名に持つシンボルは|で囲んで表現する.シンボル名に|(パイプ)そのものを含める場合には,|の前に\を置いてエスケープする.(symbol-name ‘|hoge fuga foo|)“hoge fuga foo”(setf |()| 10)10|()|10(symbol-name ‘|||)“|” 属性リスト … More シンボルとパッケージ

入出力

Common Lispでの(主にファイルの)入出力関数を試してみた.概要ストリームのオープンパス出力関数format入力with-open-file練習clcat 概要 ストリームのオープン openはストリームを作成して返す関数である.open パス &key direction element-type if-exists if-does-not-exist external-formatopenは多くのキーワード複数をもち,ストリーム作成に関していろいろな指定ができる.openのキーワード引数について以下に示す.:directionストリームの用途を指定する.値として以下のキーワード引数を取る.:input入力:output出力:io入出力:prove用途を指定しない.ストリームを作成するが,関数openが返る前にストリームはクローズされる.:element-typeファイルストリームタイプの指定.デフォルトでは文字ストリームである.他にバイトストリームに出来たりする.:if-exists:directionに:outputを指定した時に,出力ファイルが既存であればどうするかを指定する.値として以下を取る.:errorfile-errorが返る.:new-versionデフォルト.より大きなバージョン番号が振られたファイルが作成される.:rename既存のファイルがリネームされて,指定したファイル名のファイルが新規作成される.:rename-and-delete既存のファイルはリネームされてdeleteされるがexpungeされない???そして指定したファイル名のファイルが新規作成される.:overwrite既存のファイルに上書きする.open直後,ファイルポインタはファイルの先頭にある.:append既存のファイルに追加書き込みする.open直後,ファイルポインタはファイルの末尾にある.supersede既存の新ファイルで置き換える.処理系は可能ならばストリームが閉じられるまで,既存ファイルを新ファイルで置き換えない.nilファイルもストリームも作成しない.nilが返る.:if-does-not-exist指定したファイル名と同名のファイルが既存でない場合にどうするかを指定する.値として以下を取る.:errorfile-errorが返る.:create空ファイルが作成され,ファイルが既存であった場合のように処理が続行される.ただしif-existsで指定したdirectionは実行されない.nilファイルもストリームも作成されない.nilが返る.:external-formatファイルの拡張フォーマットを指定する.値として標準化されているものは:defaultのみで,あとは処理系による. パス 出力関数 format 入力 with-open-file 練習clcat 練習として,簡易版catのようなものを作成してみた.

Common Lisp

Lispを学んでどうするのか…emacsをカスタマイズしまくることぐらいしか思い浮かばないが,その思想等を学ぶことは何かと役に立つはずだ.というわけで,Emacs LispはおいといてCommon Lispをやってみる.基本編データ構造詳細入門編基本編なにはともあれCommon Lispでいろいろな式を書いてみる.準備2003-07-20T15:13+09:00 matsu実行環境についての記述とサンプルのための入出力についての記述.式と評価2003-07-20T15:13+09:00 matsu式の記述方法とその評価.データ2003-07-20T15:13+09:00 matsuLispにおけるデータについて概観する.変数の定義と代入2003-08-24T22:00+09:00 matsuLispにおける局所変数,大域変数,大域定数の定義と代入について.リストオペレータ2003-08-24T17:30+09:00 matsuリストオペレータについていくつか.if式2003-07-20T15:13+09:00 matsuLispプログラムは全てリストなので,if文といわずif式という.反復2003-08-24T21:00+09:00 matsuLispにおける反復の表現方法.関数の定義と呼び出し2003-08-24T20:25+09:00 matsuLispにおける関数の定義と呼び出しについて.練習 リストの最大値を返す2003-09-15T04:00+09:00 matsuここまで記述したLispの基本を踏まえて練習をいくつかやってみる.この頁ではリストの最大値を返す関数を作成してみる.練習 リストの要素のソート2003-09-15T06:00+09:00 matsu練習としてリストの要素をソートしてみる.データ構造LISt Processorという名前通り,リストはLispにおける基本的かつ中心的なデータ構造である.ここではコンスを通してまずリストについて前よりも詳しく記述し,さらにLispにおけるさまざまなデータ型やデータ構造についても記述する.コンス2003-09-23T18:30+09:00 matsuLispのリストはコンスと呼ばれる一対のポインタで構成される.このことを詳しく見ていくと,Lispにおけるリストをもう少し深く理解できる.リストの実体2003-10-08T21:00+09:00 matsu二つのオブジェクトへのポインタがあるとき,そのポインタが指す先は同じ実体なのか,同じ値の異なる実体なのか,といった疑問を解決してみたい.リストへのアクセス関数2003-10-11T18:00+09:00 matsuリストの任意のコンスや要素へのアクセスを可能にする関数の紹介.キューの実装にみる破壊的な関数2003-10-12T06:00+09:00 … More Common Lisp