2010-02-01から1ヶ月間の記事一覧

行列の積の計算をハードコーディング

行列の積を計算する式を直接ソースコードに貼り付けるために、プログラムを書いた。 make-matrix で作った行列ふたつを literal-product に渡して、文字のまま計算する感じ。【追記 2010-03-02】関数名がおかしかったのを修正 (defun row (m) (array-dimensi…

自由度の高めな関数合成マクロ

この前の pipe に似ているけれど、今度はその場で計算するのでなく、匿名関数を作って返す。 引数1は defun のようにパラメータ。引数2は関数の連鎖に渡される初期値となる。 キーワードは、:collect と :apply はそのまま。前者は多値をリストにまとめ、…

with-open-file の関数化

関数とファイルパスを渡して、with-open-file の中で処理をさせる。関数型言語の使い方が少し分かってきたような気がする今日この頃。 (defun safe-input (fn path) (with-open-file (ifile path) (funcall fn ifile))) (defun safe-output (fn path) (with-…

Common lisp でパイプ

シェルのパイプ機能ってとても便利だ。ruby などでメソッドをドットで繋げていくのも楽しい。ということで Common Lisp にてマクロでやってみた。 最初の引数が初期値で、その後ろに関数の名前(lambda 式でもいい)をずらずらと書いていく。キーワード :col…

完全二分木を作る関数

データ生成関数とノード数から、完全二分木(complete binary tree)を作る。 (defun make-cbt (fn size) (labels ((make-sub (i) (if (> i size) nil (if (> (* 2 i) size) (list (funcall fn i)) (nconc (list (funcall fn i) (make-sub (* 2 i))) (make-s…

let と lambda を相互変換

let と lambda がほとんど等価と聞いて。 ほとんど、というのは &optional, &rest, &key などパラメタ拡張表記を使わなければということ。たぶん。 (defun make-pair (ls1 ls2) "(a b c ...) + (1 2 3 ...) -> ((a 1) (b 2) (c 3) ...)" (if (and ls1 ls2) (…

Lisp コード内で、ダブルクオート以外の文字を使って文字列を表すリーダ・マクロ

Emacs などのエディタで、文字列の中のコードにも色を付けてもらいたい、あとバッククオートを文字列でそのまま使いたい、という動機から生まれた。 2つ以上連続する '' か、または改行。いろいろ改変可能。改行で終わらないようにすればヒア・ドキュメント…

一番外側に落ちた値を拾うマクロ

Common Lisp の対話モードでは、トップレベルで一番外側に落ちた評価結果がアスタリスクに格納されるようになっている。それをどこでも使えるようにしたかった。 ボディの前に局所変数となる名前をひとつ与える。これが外側に落ちた値を拾う。let のように括…

ファンクションキーでショートカット

だいたいこんな感じ。 (defun start-up () (interactive) (split-window-horizontally) (other-window 1) (enlarge-window (- 80 (window-width)) t) (slime) (sleep-for 3) (other-window 1) (slime-load-file "C:\\home\\lisp\\start.fasl")) (global-set-…

素因数分解パッケージ

習作。素数判定や、多倍長整数の素因数分解をする。 ;; Package for math problems about prime numbers (defpackage :math.prime (:use :common-lisp) (:export :primep :factor :afactor)) (in-package :math.prime) (defparameter *primes* (make-array 2…

Lisp で四則演算を普通の順序に

いわゆる再帰下降パーサ。『C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)』の「式の評価」の項を、ページに開き癖がつくほど参考にした。 一応、シンボルは書いた順序どおりに評価されるはず。 単項演算の(つまり符号反転の)マイナス記号…

キーバインディング

現在のキーバインディング。 (global-set-key "\C-h" 'delete-backward-char) (global-set-key "\M-h" 'backward-kill-word) (global-set-key "\M-k" 'kill-whole-line) (global-set-key "\M-?" 'help-for-help) (global-set-key "\M-s" 'save-buffer) (glob…

単機能ベンチマーク

繰り返し回数を決めて、時間を測るだけというストイックさ。そのくせ複数フォームを渡せるという無駄仕様。 (defmacro benchmark (times &body body) (let ((gi (gensym))) `(progn ,@(mapcar #'(lambda (form) `(progn (print ',form *trace-output*) (time…

Windows で Meadow + Allegro Common Lisp + SLIME のときの設定

http://www.franz.com/emacs/slime.lhtml ほとんどそのまま。日本語を使えるように1行だけ追加してある。 (push "c:/meadow/site-lisp/slime/" load-path) (require 'slime-autoloads) (require 'slime) (setq slime-net-coding-system 'utf-8-unix) ; For …