2012年10月のlog
>> Site top >> weblog >> 月別アーカイブ >> 2012年10月のlog
最終更新日付:2012/10/01 00:00:00
辿り着いた先
2012 年 10 月 03 日
最近、Common Lisp ばかりやっている。C++ をやり込んだあと、興味をそそられるような言語はこれしかなかった。日本語の情報が非常に少ないのに難儀するが、書籍も書いまくっている。CLtL2 の日本語訳書、Palm Graham の本を2冊、あと他に数冊というところ。
アルゴリズムとクロージャと
2012 年 10 月 07 日
以前書いたとおり、最近は Common Lisp で STL アルゴリズムと同じようなものを作っている。最初に書いたのは、ひとまず以下のようなものだった。
(defun copy-if (seq pred) (labels ((list-imp (lst acc) (if (null lst) (nreverse acc) (let ((itm (car lst))) (if (funcall pred itm) (push itm acc)) (list-imp (cdr lst) acc)))) (array-imp (idx cnt acc) (if (<= cnt idx) acc (let ((itm (aref seq idx))) (if (funcall pred itm) (vector-push itm acc)) (array-imp (1+ idx) cnt acc))))) (cond ((listp seq) (list-imp seq nil)) ((arrayp seq) (let ((cnt (length seq))) (array-imp 0 cnt (make-array cnt :fill-pointer 0)))) (t (error "not a sequence.")))))
アルゴリズムとクロージャと - 2
2012 年 10 月 08 日
先日書いた、リストを直接扱うアルゴリズム。これの for_each 版は以下のようなものだった。
(defun for-each (seq func) (labels ((list-imp (lst) (if (null lst) nil (progn (funcall func (car lst)) (list-imp (cdr lst))))) (array-imp (idx cnt) (if (<= cnt idx) nil (progn (funcall func (aref seq idx)) (array-imp (1+ idx) cnt))))) (cond ((listp seq) (list-imp seq)) ((arrayp seq) (array-imp 0 (length seq))) (t (error "not a sequence.")))))
アルゴリズムとクロージャと - 3
2012 年 10 月 10 日
先日の続き。クロージャ以外の方法を検討する前に、気になっていることを確認した。それは、最初の(リストや配列を直接扱う)実装と、クロージャを使った反復子、それぞれについてリストと配列、合計4種類の実行時間を比べることだ。
アルゴリズムとクロージャと - 4
2012 年 10 月 15 日
前回まででクロージャを使用した反復子を使ってみたが、リストを直接扱うアルゴリズムよりもかなり遅かった。さらに別の方法を模索してみる。
アルゴリズムとクロージャと - 5
2012 年 10 月 17 日
「こっちの方が速いだろう」と思うものを試すたびにどんどん遅くなっていく。自信をなくしてしまうような経験だが、それはそれでいつか糧になる、と信じてみよう。今度はCLOS を試してみる。
Copyright(C) 2005-2021 project-enigma.
Generated by CL-PREFAB.