本当に終了

Igoの開発がドキュメント書きも含めてようやく一段落。 なんだかんだで終了まで一ヶ月近く掛ってしまったが、ようやくこれで別のことに(気持ち的に)本腰を入れて取りかかれる。

:a

;; sbcl-1.0.37, clisp-2.42, ClozureCL-1.4 > *print-case* > :UPCASE > :a > :A > :a > :A > 'abcdè > ABCDÈ さすがユニコード対応。

配列スタック

配列を用いたスタック実装。 組み込みのlistを使ったスタックと比較したくて作成。 cl-igoでlistスタックを用いている箇所*1を、下記配列スタックで置換してみたが、特にメリットはなかった(逆に10%程度遅くなった。sbcl-1.0.34)。またどこかで使いたいこと…

Igo : sbcl-1.0.28, sbcl-1.0.37

以前、計時を行った条件に合わせてcommon lisp版のIgo(0.2.3)をsbclのバージョン1.0.28で動かしてみたところ、処理を終えるまでに92.712秒かかった。 sbclのバージョンを1.0.37に替え、それ以外は同様の条件で試してみたところ、こちらは33.962秒で終了。 3…

式一つ分のコメントアウト

common lispで開発していると、たまに式一つ分だけコメントアウトしたくなることがある。 そういった機能は標準ではないかと思っていたが、条件付き読み込み(?)を使えば似たようなことが出来ることに気がついた。 ;; (+ 20 30)をコメントアウト > (+ 10 #+c …

make-sequenceとmake-array

sbcl-1.0.34での話。 make-sequence関数はmake-array関数よりも特殊化されているので、より高速なのかと思っていたら、そうではなかった。 ;; make-array関数 > (time (loop repeat 1000000 sum (length (make-array 1000 :initial-element 0)))) Evaluation…

Igo : Common Lisp版

Javaで作成していた形態素解析器のCommon Lisp版も作成(cl-igo)。 バイナリ辞書はJavaで作成したものを使用するようにし、辞書の読み込み・形態素解析部分だけをcommon lispで実装した。 ユニコード文字列に対応している処理系なら、多分動くはず...。※ 確認…

Igo : MeCabと形態素解析速度比較

Igo(0.4.0)とMeCab(0.97)の形態素解析速度を再度比較してみた。 計時用のプログラム MeCabの計時用のプログラム。 参照: ReadLine /** * ファイル名: mec.cc * コンパイル: g++ -O3 -omec mec.cc `mecab-config --libs` * 計時方法: time mec <対象ファイル>…

終了

先週の日曜から取り組んでいたJavaでの形態素解析器の実装がひとまず終了。 完成物: Igoまだ、例外処理周りの整備とか、ドキュメント作成とかは残っているが、実装が大幅に修正されることはもうなさそう。 特徴 思いつく特徴を列挙。 Java ほぼMeCab互換 MeC…

結果

前回の予告の結果。 一応、それらしいものは出来た。 igoという名前をつけてプロジェクトも作成*1。 ただ、何とか動作はするが、ソースコードやクラスの構成はメチャクチャ。 あと、若干MeCabと出力(形態素解析結果)が異なることがある。※ 要調査 その他、諸…

予告

予告 明日・明後日は仕事が休みなので、それを利用してJavaの形態素解析器を作ることにする。 作るもの ・完全にJavaで書かれた形態素解析器(+ その中で使われるDoubleArray) ・MeCabと辞書互換が目標 ・ただし、サポートするのは単純な形態素解析のみ ・既…

IPA辞書から無駄な項目を省く(MeCab)

MeCabのサイトからダウンロードできるIPA辞書には、無駄な項目(単語)が若干含まれている。 ※ '無駄'とは普通の形態素解析しか行わない限り。N-Best解などの結果を使いたい場合は別。 # IPA辞書のダウンロードディレクトリに移動 $ cd mecab-ipadic-2.7.0-200…

errno文字列表現取得関数

sbclを使って、errnoの値に対応するメッセージを簡単に取得する方法。 sb-int:strerror関数を使う。 ;; errno=22の場合 > (sb-int:strerror 22) --> "Invalid argument" ;; errno=2の場合 > (sb-int:strerror 2) --> "No such file or directory"

コムソート

llvmのチュートリアルの続きを読もうと思ったら、今はドキュメント関連のページがエラーで見れなくなっていたので、代わりに前から少し気になっていたコムソートを実装してみることにする。 参考サイト: コムソート - Wikipedia(最終更新 2009年11月29日 (日…

llvm : tutorial : jit

チュートリアル第四章『4. Kaleidoscope: Adding JIT and Optimizer Support — LLVM 3.4 documentation』の2。タイトルにはJITとあるが、僕のこれまでの進め方ではチュートリアル通りのJITは実現できないので、似たような動作をする方法でごまかす。 実装 …

Thunderbirdのメール(メッセージ)を検索・選択するURLプロトコルの追加方法

昨晩から、自分では使わないThunderbirdの拡張機能周りを何故かいろいろ調べていたので、そのメモ。 やりたいこと HTMLに記述された次のようなリンクが記述されているとする。 <a href="mailmsg://HelloWorld">件名に「HelloWorld」を含むメールを検索する</a> このリンクをクリックすると、thun…

llvm : tutorial : optimize

チュートリアル第四章『4. Kaleidoscope: Adding JIT and Optimizer Support — LLVM 3.4 documentation』。 タイトルの通り、ここではJIT(を用いたRead-Eval-Print-Loop)とoptimizeがKaleidoscopeに加わっている。 前者は少しやっかいなので、分割して今回は…

llvm : tutorial : code generation

llvmのチュートリアルの続き。 今回はパースして得られた抽象構文木から、llvmの(llvm IRの?)コードを生成する。 概要? オリジナルのチュートリアルでは、コード生成にC++のビルダクラスが使われているが、common lisp用のそういったモジュールは用意されて…

llvm : tutorial : lexer,parser

llvmに関する基本的な(?)ドキュメントには一通り目を通した感じなので、次は『LLVM Tutorial』に沿って、Kaleidoscopeという言語を実装してみることにする。 上記チュートリアルでは実装言語として、C++及びOCamlが用いられていたが、自分はcommon lispが一…

equal-case

equal等値なキーを扱えるようにしたcase。 主にstring型に対して適用することを想定。 ;; TODO: 重複キーのチェック(警告)をつけるべき (defmacro equal-case (expr &rest clauses) (let ((v (gensym))) `(let ((,v ,expr)) (cond ,@(stable-sort (mapcar (l…

llvm : 例外処理

llvm(2.6)での例外処理。 例外処理のドキュメン*1は一応用意されているのだが、簡潔かつ実例が皆無なので、試すのに結構苦労した。 以下は、その簡単なまとめとメモ。 llvmでの例外処理の種類 llvmであらかじめサポートされている(?)例外処理の方法は三つ。 …

llvm : GC, bitcode

llvmのGC*1およびビットコード*2に関するドキュメントに、ごく簡単に目を通す。 GC llvmはすぐに使えるようなGCを提供してはいなかった。 ただ、GCを組み込むことはあらかじめ想定されており、そのためのフレームは用意されているようなので、GCを実装・利用…

読了x2

『LLVM Language Reference Manual — LLVM 3.4 documentation』を一通り読み終わる。 仕事の行き帰りに読んでいた『Java 並行処理プログラミング』*1も同時に終了。llvmは、そろそろ本格的にコード(or コードジェネレータ)が書きたくなってきたが、まだ最低G…

llvm : 'phi' Instruction

『LLVM Language Reference Manual — LLVM 3.4 documentation』を引き続き読む。 phi命令の動作が読んだだけでは分からなかったので、実際に動かして試してみた。 コード: ;;; ファイル名: phi.ll ;;; コンパイル: llvm-as phi.ll -o phi.bc ;;; コマンドの…

llvm : ハノイの塔

少し面白そうだったのでllvm(Low Level Virtual Machine)のマニュアル*1を読んでみる。 今日は、半分くらいまで読んで終了。 現時点の知識で、ハノイの塔を実装してみた。 ;;; ファイル名: hanoi.ll ; printf関数に渡すフォーマット文字列 @.MSG = internal …

関数のドキュメント

JavaにはJavadocという有名なドキュメントコメントがある。 (実践しているかどうかは別として)関数その他にドキュメントをつけるという考えは良いと思う。 ただ、Javadocの場合、名前の通り(一定の規約に従った)コメントを使って(関数その他の)文書化を行っ…

一文字マクロ文字

パターンマッチがある関数型言語でよく見かける_変数*1をsbclでも使えないかと少し試してみた。 結局満足出来る結果は得られなかったが、作成したものの一部をメモして残しておく。 ;; 以下は、マクロ文字候補文字xが ;; シンボル名の一部として解釈できない…

Qi

Qiという型安全なlispがあるらしい。 僕がcommon lispで物足りないと思うことの一つが、静的型の欠如*1 *2なので、結構興味がある。 公式サイトドキュメントが面白そうなので、後で読む。 ### 最近はやりたいことが多すぎて、毎日寝不足。 仕事が...。 追記:…

eLisp : Embedded Lisp

Railsをやったことがある人ならお馴染みのeRuby(もどき)を、common lispで実装してみた。 所要時間およそ90分、行数はコメント込みで70行足らずという簡単なもの。 文法 eRubyの文法は次のように紹介されている(Wikipediaで)。 HTMLファイルの中に (もしく…

列の分割

文字列の分割を行いたいけど、cl-ppcreパッケージをその(cl-ppcre:split関数の)ためだけに使用したくはなかったので、分割関数を作成した。 ;; 第一版: 平易 (defun split (delim seq &aux (len (length delim))) (declare (unmuffle-conditions compiler-no…