sbcl

一意なID(ポインタアドレス)取得

たまに、(正確な用語ではないが)オブジェクトごとに一意なIDを取得したいことがある。 Cで云うポインタがあれば、それが適切なのだが、common lispにはポインタを取得する方法は定義されていない(と思う)。 ただ、SBCLに限れば、ポインタ(アドレス)を取得す…

SBCLでマシンコードを直接実行

どこかで、sbclでメモリ領域に直接マシンコードを書き込んで実行できる、というような話を読んだような気がするので試してみた*1。 まずは、(マシンコードを取得するために)実行したい関数をCで定義する。 簡単なものがいいので、二つの変数を足すだけの関数…

HTTPリクエストの中身を表示するだけのHTTPサーバ

タイトルの通りのHTTPサーバを作成。 というか、ほとんど何も行っていないので、HTTPサーバとは云えないような気もする...。 ソースコード (require :sb-bsd-sockets) (use-package :sb-bsd-sockets) ;; 定数 (defconstant CRLF (coerce '(#\Return #\Newlin…

HTMLパーサ - ボトルネック解消

昨日のブログにあるHTMLパーサを試していたら、(組み込みのものではない)read-xxx系関数がボトルネックとなっていることが分かったので、修正する。一番、大きな影響を与えていたのは、この関数(若干簡略化)。 ;; (funcall fn c)がtになるまで、文字列を読み…

バイト列->文字列(コンディション処理)

バイト列を文字列に変換したい時には、sbclではsb-ext:octets-to-stringという関数を使えば良いのだが、これはそのままでは、文字コードの解釈に部分的にでも失敗するとバイト列全体の変換が失敗するという難があった*1。 バイト列のデコードに失敗した場合…

型分岐最適化

sbcl(1.0.28)は、適切に型宣言を行っておけば、冗長な型判定を実行コードから除外してくれるようだ。例えば次のようなマクロを定義する。 (defmacro get-type (obj) `(typecase ,obj (list :list) (fixnum :fixnum) (vector :vector) (t :others))) ; ↓のよ…

HTTPクライアント作成

簡単なcommon lispのHTTPクライアントをHTTPの勉強を兼ねて作成。ソースコード(*.lisp)は、約170行程度。まだまだ十分な完成度とは云えないが、せっかくなので公開してみる。 これ、tiny-http(0.1.3)。※置き場は暫定 インストールが必要な依存packageは次の…

文字列の正規化

昨日は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 …