lispでスパムフィルタの実装 (実践Common Lisp 23章)

単語の特徴を表すクラスを作って、ベイジアンフィルタを実装していく。

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

  • print-unreadable-objectを使うと印字方法を変えられる。pythonでいう__str__メソッドみたいなものか。
  • caseとecaseの違いがわからん
  • reduceは:keyを受ける

最後のヤツは対数の総和をとるのに

(reduce #'+ probs :key #'log)
# reduce(lambda x,y:log(x)+log(y),list) ;python

こんな風に書くことが出来る。

実践Common Lisp 18-22章

format,例外処理,package,LOOPあたり

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

ちまちま読んでてあまり頭に入らないのでざっと目を通して脳内インデックスを作っておく感じで眺めた。理解する必要が生じた場合に戻ってきて読めばいいのだろう。

これ以降はすべて実践の章で面白そうな内容ばかり。特に次の章はlispで作るベイジアンフィルタだ。

macbookでsbcl+asdf(asdf-install)

asdf(日本語)とはperlでいうところのCPANみたいなものらしい。

でもってperl互換な正規表現ライブラリのcl-ppcreをインストールしてみる。

ちなみに毎回asdfをrequireするのは面倒なので.sbclrcに

(require 'asdf)

って一行入れてある。

asdf-installはgpgを使っているのでここを参考にして設定した。

で、インストールはsbclを起動して

(require 'asdf-install)
(asdf-install:install 'cl-ppcre)

って打つだけ。おーなんかcpanみたいで気持ちいい。

インストールできたら実際に使ってみる。どう書く?の税込み価格への修正をやってみた。asdfだとloadの仕方がちょっと違うみたい。

* (asdf:operate 'asdf:load-op 'cl-ppcre)

NIL
* (defun including-tax (string)
  (cl-ppcre:regex-replace-all
   "\\d+" string
   (lambda (num) (format nil "~a" (floor (* (parse-integer num) 1.05))))
   :simple-calls t))

INCLUDING-TAX
* (including-tax "ダイコン150円、ハクサイ120円、ジャガイモ30円")

"ダイコン157円、ハクサイ125円、ジャガイモ31円"
T

感激!

さて、loadする時にasdf:operateって書いてあったりasdf:oosって書いてあったりして違いがわからなかったのだけど、oos is a synonym for operateなんだそうだ。


パッケージを見てたらperl-in-lispというものを見つけた。おもしろそうなのであとで触る。

あとpython-on-lispというものもあるらしい。

実践Common Lisp 16,17章(オブジェクト指向)

lispでオブジェクト指向。

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

この2つの章だけでは理解がいまいちだったけど、次のページが参考になった。

λ計算(Y-combinator)

入門Common Lispの第8章が面白いですね。

ProductName 入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算
新納 浩幸
毎日コミュニケーションズ / ¥ 2,415 ()
通常24時間以内に発送

λ式を使って数を定義していって、次に足し算、掛け算を実装。最後にY-combinatorを使った再帰を定義して、階乗を計算させる。

(defun Y (f n) (funcall (funcall f f) n))

この流れでGrassも理解しておきたいところ。

実践Common Lisp 10-15章

数、文字、文字列、コレクション(ベクタ)、リスト、連想リスト、属性リスト、ファイルIOに関して一通りやって、パスネーム可搬ライブラリを実装してみる。

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

ここらへんの内容はxyzzy Lisp Programmingのほうが丁寧に書いてあると思う。

次はlispでオブジェクト指向に入っていく。ちょっと楽しみ。

実践Common Lisp 7-9章

マクロに関して。

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

9章でマクロを使ってユニットテストを書いていくんだけど、抽象化の過程がやたらと面白かった。

実践Common Lisp 4-6章

シンタックス、セマンティクス、変数、関数あたりの説明。

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

ダイナミック変数ってのは要するにperlでいうグローバル変数のようなものか?そしてletがlocalに似た挙動を示すっぽいな。

実践Common Lispが来た

来た。

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送

Common Lisp 入門を読んでおいたので、さくっと3章くらいまで読んだ。

3章でいきなり属性リストを使ったデータベースを作り始めたが、ストレスなく読み進められそうで良書の予感はする。

カウンターのクロージャ

common lispだと

(let ((count 0))
  (list
  #'(lambda () (incf count))
  #'(lambda () (decf count))
  #'(lambda () (count)))

同じことをperlでもlispっぽくかける。

#!/usr/bin/env perl

use Perl6::Say;

sub make_counter {
  my $c = 0;
  return (
      sub {$c++},
      sub {$c--},
      sub {$c}
     );
}

my ($inc,$dec,$counter) = make_counter();

say $counter->(); # 0
$inc->();
$inc->();
$inc->();
say $counter->(); # 3
$dec->();
say $counter->(); # 2

ProductName 実践Common Lisp
Peter Seibel
オーム社 / ¥ 4,410 ()
通常24時間以内に発送