EDIT: 2012-08-29: I added a section to compare comparison counts with known bounds for general comparison sorts and sorting networks. In an earlier post, I noted how tedious coding unrolled sorts can be. Frankly, that’s the main reason I stopped at leaf sorts of size three. Recently, Neil Toronto wrote a nice post on the generation of size-specialised merge sorts. The post made me think about that
テキストファイルの各行をバイト列として読み込むマクロを定義。 SBCL等のように文字列を内部的にユニコードとして表現している処理系では、テキストファイルを読み込む際、そのファイルが不正なバイト列を含んでいると読み込みに失敗することがあるので、その対処として。 ;;;; エラーの例 ;;;; sbcl-1.0.40 ;;;; ;; 普通の行読み込みマクロを定義 (defmacro each-file-line ((line filepath) &body body) `(with-open-file (#1=#:in ,filepath) (loop FOR ,line = (read-line #1# nil nil) WHILE ,line DO (progn ,@BODY)))) ;;;; ;; 不正なバイト列を含むテキストファイルの作成 (with-open-file (out "s
SBCLのマニュアル(ver 1.0.37)にも書いてあることだけど ... 。 通常は構造体のインスタンスを作成するとヒープ上にそのための領域が割り当てられる。 これには(おそらく)ヒープ割り当て+GC処理のコストが伴うので、構造体としてまとめるよりも、その各フィールドを個別に扱った方が、パフォーマンス的には有利だったりする。 ;; sbcl-1.0.40 ;; ;; 構造体のインスタンス作成のコストを測るためプログラム ;; 範囲を表す構造体 (defstruct range start end) ;; 範囲をランダムに複数生成し、それらの距離の合計値を求める ;; 1) 構造体を使う場合 (time (let ((total 0)) (loop REPEAT 1000000 DO (let ((r (make-range :start (random 100) :end (rando
sbcl(1.0.28)では、実行可能ファイルを作成することができる。 > (sb-ext:save-lisp-and-die "実行可能ファイル名" :toplevel #'エントリ関数 :executable t) エントリ関数には(必須引数の数が0個なら?)どのような関数でも指定可能なのだが、いろいろクセがあるため期待通りに動く関数を一から作成するのは、若干手間取ったりする。 なので、エントリ関数作成用のマクロを作成した。 そこまで汎用的ではないので、その時々で手を加える必要があるとは思うが、テンプレートとしては十分だと思う。 以下コード: ;; パスのファイル名部分を取り出す (defun basename (pathstring) (let ((path (parse-namestring pathstring))) (format nil "~A~@[.~A~]" (pathn
aproposとdescribeを一緒にしたような関数を作成。 名前はそのままapropos-desc。 aproposを使えば、シンボル一覧が取得できるが、それに(そのシンボルにバインドしている)関数などの簡単な情報(引数、返り値、ドキュメント)も一緒に表示されるようにした。 基本的には、apropos-listの結果にdescribeを適用しただけだが、sbclの標準のdescribe出力は若干量が多すぎることがあるので、自分に必要な情報だけを出力するようにして、一覧性を上げている。 例 ;; 第三引数までは、apropos関数と同様 ;; "multiple"を含むシンボルをcommon-lispパッケージから探して、その名前と簡易的な情報を表示する。 > (apropos-desc "multiple" :common-lisp t) === multiple-value-bind
alpha-char-p関数が自分の予想外の挙動をするのを発見。(確認したのは、sbclとclisp) ;; 予想通り > (alpha-char-p #\a) --> T ;; これも > (alpha-char-p #\0) --> NIL ;; 予想外 > (alpha-char-p #\あ) --> T 別に「アルファベット」が、aからzまでの文字だけを指すわけではないので、上の挙動は適切なのだろうが、何となくこういう関数はa〜z,A〜Zの文字にだけtrueを返す印象があった(Cのisalphaとかの影響か?)。 『Common LISP 第2版』には、alpha-char-pの説明として「標準文字(standard-char-pによって定義されるもの)に対しては文字AからZまでとaからzまでがアルファベットである」(p.331)と書かれているので、(and (standard-c
最近のバージョンのSBCL*1では、処理速度を最優先にする宣言を行って関数をコンパイルした場合でも、デフォルトではコンパイラノート*2が表示されないことがある*3。 そのため、最適化を確実に行いたい場合は、コンパイラノートを出力するように明示的に宣言する必要がある。 (declare (optimize (debug 0) (safety 0) (speed 3) (compilation-speed 0)) ;; ↓これが必要 (sb-ext:unmuffle-conditions sb-ext:compiler-note)) また、これはどうやらdeclaimで宣言した場合は無効で、declareを使う必要があるようだ。 *1:今回試したのは1.0.28 *2:最適化を行うために修正が必要な箇所などを教えてくれる *3:多分compile-file関数でコンパイルを行う場合は、デフォル
sbcl This manual is part of the SBCL software system. See the README file for more information. This manual is largely derived from the manual for the CMUCL system, which was produced at Carnegie Mellon University and later released into the public domain. This manual is in the public domain and is provided with absolutely no warranty. See the COPYING and CREDITS files for more information.
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く