2009-06-01から1ヶ月間の記事一覧

文字列の別表記

プログラミング言語によっては、文字列を複数の方法で表記出来ることがある。 例えば、rubyの場合は以下の様に表記することが可能だ。 "文字列" '文字列' %Q{文字列} # その他にもあったように思うけど、使わないので不明。 対して、common lispの場合は、ダ…

リスト用のマージソート-若干改良-

前回書いたマージソートを、ちょこちょこ修正。 まずは、安定なマージ関数を少しすっきりさせてみる。 (defmacro with-null-check ((var1 var2) &body body) `(cond ((null ,var1) ,var2) ((null ,var2) ,var1) (t ,@body))) ;; 多重評価の問題あり (defmacr…

lispでドット表記関数呼び出し

一般的なオブジェクト指向言語では、メソッドを、インスタンス(オブジェクト)とメソッドの間にドット(.)をつけた表記で呼び出せることが多い。 # メソッド呼び出し object.method # ドットを繋げて、複数のメソッド呼び出し object.methodA.methodB lispでコ…

文字列の正規化

昨日はMeCabバインディングを取り上げたが、MeCabを使うようなコードを書いている場合、文字列を正規化したくなることがたまにある。なので、簡単な文字列正規化関数をlispで実装してみることにする。 ※ ただし、文字の内部的なコード(char-code)に依存して…

MeCabバインディングとFFI

common lispからmecabを使う方法のメモ(sbcl依存)。まずは、多分一番直截的な方法: ;;;;;;;; ;;;; FFI(Foreign Function Interface)用のpackageを使用する (use-package :sb-alien) ;;;;;;;; ;;;; so読み込みと関数定義 (load-shared-object "/usr/local/lib…

配列用のクイックソート(簡単版)

昨日に引き続き、今日はクイックソートを書いてみる。一口にクイックソートと云っても、一番内部のループ(配列を二つに分割する処理)の実装方法にいろいろ変種があるので、とりあえず一番楽に実装できそうなものを思い出しつつ書いてみる。 (defun qsort (as …

リスト用のマージソート

リスト用のマージソートを書いて見た。・以下ソース(関数はどれも破壊的) ;;; 最速(?)のoptimize宣言 (defvar fastest '(optimize (debug 0) (speed 3) (safety 0))) ;;; 2つのlistのマージ (defun merge-list (lst1 lst2 <) (declare #.fastest (function <…

emacsタブ拡張

標準のlisp-modeのタブ動作では、望み通りにインデントされないことがあるので、バックタブ(Shift+Tab)用の関数を作成。 標準のタブでのインデント: (multiple-value-bind (a b c) (values 1 2 3) (list a b c)) 作成したバックタブ用関数でのインデント: ※ …