カテゴリ「STLとその移植」のlog
>> Site top >> weblog >> カテゴリ別アーカイブ >> カテゴリ「STLとその移植」のlog
最終更新日付:2005/01/01 00:00:00
transform_exclusive_scanの追加
2019 年 05 月 08 日
今回は transform_exclusive_scan を追加。くどいようだけど、cl-stl では並行性はひとまず無視している。今回は、結果的にオーバーロードはなしだった。以下がそのコミット。
あと、前回のコミットでドキュメンテーション文字列やコメントにいくつも間違いがあった。今回のコミットに紛れ込ませて直したけど、やはり慌てて作業してはいけないねぇ。
transform_inclusive_scanの追加
2019 年 05 月 06 日
仕切り直しの今回は transform_inclusive_scan を追加。以前も書いたけど、cl-stl では並行性は無関係なので、オーバーロードは少ない。以下がそのコミット。
exclusive_scanの追加
2019 年 03 月 18 日
続いて exclusive_scan を追加。これもまぁ、inclusive / exclusive の違いを除けばpartial_sum とだいたい一緒。以下がそのコミット。
inclusive_scanの追加
2019 年 03 月 15 日
今度は inclusive_scan を追加。cl-stl では並行性はひとまず無関係なので、partial_sum とほぼ選ぶところがない。まぁでもそれはそれ。以下がそのコミット。
transform_reduceの追加
2019 年 03 月 01 日
今度は transform_reduce を追加。これは transform と accumulateを複合させたような処理を行なうので、結構使えるかもしれない。以下がそのコミット。
reduceの追加
2019 年 02 月 27 日
昨日に続いて、今度は reduce を追加した。といっても、並行性とは関係のない実装なので、ほとんど accumulate と一緒なのだけれど。以下がそのコミット。
for_each_nの追加
2019 年 02 月 26 日
C++17 では、並行性を意識したアルゴリズムが追加されたようだ。そこらへん、あまり追従できていないのだけれど、同じことをするアルゴリズムでも並行性とは関係のないモノも追加されているらしい。なので、ひとまず並行性とは関係のない実装を cl-stl には追加することにした。C++17 で追加されたアルゴリズム(numeric も含む)には以下があるらしいのだけれど、
- for_each_n
- reduce
- inclusive_scan
- exclusive_scan
- transform_reduce
- transform_inclusive_scan
- transform_exclusive_scan
今回は手始めに for_each_n だけ。以下がそのコミット。
ptr_funとmem_fun系の削除
2019 年 02 月 12 日
C++17 では funtional に含まれる関数やクラスが色々削除された。以前 binder1st とかの削除を報告したが、今回は残りのやつに対処。おおまかに、以下。
- ptr_fun 関数
- pointer_to_unary_function クラス
- pointer_to_binary_function クラス
- mem_fun() 関数
- mem_fun_ref() 関数
- mem_fun_t クラス
- mem_fun1_t クラス
- mem_fun_ref_t クラス
- mem_fun1_ref_t クラス
- const_mem_fun_t クラス
- const_mem_fun1_t クラス
- const_mem_fun_ref_t クラス
- const_mem_fun1_ref_t クラス
以下がそのコミット。
テストの所要時間を短縮する
2019 年 01 月 29 日
ずっと気になっていたのだ。現在、cl-stl のテストは全体の実行に1時間くらいかかる。理由は後で書くけど、とにかく時間がかかるのだ。これをなんとかしないと、テストを更新・実行するのが嫌になってしまう。というわけで、どうにかして短縮しようと足掻いてみた。
binder1stなどの削除
2019 年 01 月 23 日
C++11 で bind が追加され、C++17でとうとう binder1st と binder2nd が削除された。というわけで、今回は以下の削除をした。
- binder1st
- bind1st
- binder2nd
- bind2nd
以下がそのコミット。
not_fn追加に伴うdeprecated化対応
2019 年 01 月 18 日
先日書いた、not_fn の追加。これによって、C++17 では以下が非推奨となった。
- not1
- not2
- unary_negate
- binary_negate
今回はその対応。
make_from_tupleの追加
2019 年 01 月 16 日
C++17 で、make_from_tuple というのが追加された。tuple の内容をパラメータとしてコンストラクタを呼び出すものだ。
今回はその make_from_tuple を追加する対応。
not_fnの追加
2019 年 01 月 11 日
C++17 で、not_fn というのが追加された。可変長テンプレートを利用して以下を置き換えるものだ。
- not1
- not2
- unary_negate
- binary_negate
今回はその not_fn を追加する対応。
forward_listからsizeメソッドを削除
2019 年 01 月 07 日
今回は、どう考えても間違っていた自分の判断を修正する作業。forward_list からの size メソッドの削除だ。
clampアルゴリズムの追加
2019 年 01 月 06 日
C++17 で clamp 関数テンプレートが追加された。これへの対応。
random_shuffleアルゴリズムの削除
2019 年 01 月 05 日
これは元旦にコミットしたやつかな。C++14/17 での変更。
emplace系メソッドが追加要素の参照を返す
2019 年 01 月 04 日
昨年の大晦日にコミットしたやつを、今更紹介。C++17 での変更。
applyを追加したいのだけど-2
2018 年 09 月 03 日
昨日書いたこと、もう少しだけ速くできそうだ。
applyを追加したいのだけど
2018 年 09 月 02 日
C++17 では、std::apply が追加された。std::tuple の内容をパラメータとして、関数を呼び出せるものらしい。これを CL-STL に追加したい、という話。しかし、内部表現の変換コストが気になってしまう、という話。
「値コピー原則」の破棄‥‥‥で悩む-2
2018 年 07 月 12 日
結論が出る気がしない、「値コピー原則の破棄」問題。判断つきかねるというよりは、単に面倒臭いだけか。実際に手を下した場合にどうなるかを考えたら、余計に面倒臭くなった。
「値コピー原則」の破棄‥‥‥で悩む
2018 年 07 月 11 日
cl-stl について、ずっと悩んでいることがある。それは、「値コピーの原則」だ。cl-stl を可能な限り STL に寄せるために、Common Lisp の感覚からすれば少々不自然なことをやっていた。それを今になって、捨ててしまおうかと考えている‥‥‥というか、悩んでいる。
SBCL なら sequence を自作できるらしい
2017 年 07 月 30 日
Common Lisp Recipes を読んでいて知ったことだ。SBCL で sb-sequence パッケージの総称関数を適切に定義することで、自作のクラスを sequence にすることができるらしい。CL-STL のコンテナをそうできたら素敵じゃないか。
CL-OVERLOAD:コンストラクタのためのコンパイラマクロ定義機能を追加
2016 年 12 月 23 日
えーと、どこから説明しようかな。stl:make_tuple にコンパイラマクロが追加された結果、(new stl:tuple ...) とやるのが嫌になってきた。だから CL-OVERLOAD を改造しようと思って試したら上手くいった、という話。
CL-OPERATOR:clonableの代入時コピールールを変更
2016 年 12 月 21 日
うん、変更した。元々の挙動は仕様通りだったはずなんだけど、その仕様がそもそもおかしかったので、改善というよりはバグフィックスだな。
最適化とは無関係なintializer_listの変更
2016 年 12 月 17 日
昨日の失敗で少し落ち込んだけれど、ちょっと思いついたことがあるのでやってしまった。
initializer_listで失敗
2016 年 12 月 16 日
まぁ、なんていうか、調子に乗ったのかもしれない。最適化できると思ったが何重にも間違っていた、という話。
ひとまず大丈夫みたい
2016 年 12 月 15 日
修正前後の比較をしてみた。一応期待(というか予想)の通りだったと言えそうな感じ。
pairクラスを刷新
2016 年 12 月 14 日
‥‥‥だけのつもりだったのに、なんだかオオゴトになってしまった。
make_tupleにコンパイラマクロを追加
2016 年 12 月 09 日
ひさしぶりに CL-STL に手を入れた。あ、非順序連想コンテナのことは忘れたわけじゃないんです。
swapとmoveの移動について
2016 年 05 月 29 日
CL-STL の中には swap と move というのがある。現在検討中の CL-IOSTREAM にも同じモノがあり、CL-STL は将来 CL-IOSTREAM に依存することになる。このままではマズいので、共通の基盤ライブラリである CL-OPERATOR あたりに移動しようかと考えている。今回はそんな話。
ファンクタをfuncallableにする問題について-2
2016 年 05 月 26 日
前回、ひとまずはやる価値ありと判断したファンクタの funcallable 化問題。今回は実際にどんな修正をすることになるかを整理する。前回書いた内容に対しては、「このへんが参考になるよー」といった情報を Twitter 経由で頂いた。感謝致します。
ファンクタをfuncallableにする問題について
2016 年 05 月 24 日
さて、そろそろアレに取り組んでみようと思った。任意のクラスを funcallable にできるよ、と教えて頂いたアレだ。試行錯誤の末、とりあえず以下のような実験コードになった。
(defclass functor (sb-mop:funcallable-standard-object) ((closure :type cl:function :initform nil :initarg :closure :accessor functor-closure)) (:metaclass SB-MOP:FUNCALLABLE-STANDARD-CLASS)) (defmethod initialize-instance :after ((fnctr functor) &key) (sb-pcl::set-funcallable-instance-function fnctr (functor-closure fnctr)))
まだ可搬性は意識していないので、SBCL に固有の sb-mop:funcallable-standard-object とか sb-pcl::set-funcallable-instance-function とかが露出している。また、functor クラスは実行コード自体をメンバとして保有し、initialize-instance において登録をするようになっている。これがベストの方法なのかどうかはわからない。今回は実験なので、これでひとまずパフォーマンスを見てみようかと思う。
CLにおける包括的コンパイル時解決を妄想する
2016 年 05 月 01 日
先日の個人的反省会の最後で書いた、コンパイル時解決の話。あの時は以下の3点が揃っている必要があると書いた。あ、違う4点だった。
- テンプレート
- inner type とそのコンパイル時アクセス
- シンボルや式からの型導出と型伝播
- 上記3点を前提としたコンパイル時解決
で、具体的にやりたいことはどんなことなのか、ちょっと妄想がてら整理してみた。
CL-STLのシンボル衝突問題について-2
2016 年 04 月 30 日
前回書いたシンボル衝突問題、一気にやってしまった。ひとまずのところ上手くいってくれたので、もうちょっと我慢すべきかと思ったのだが GitHub にまでアゲてしまった。
CL-STLのシンボル衝突問題について
2016 年 04 月 30 日
さて、CL-STL のシンボル衝突問題。CL-STL は CL のシンボルといくつも衝突しているため、これまでは use-package しない前提になっていた。そのために全てのシンボルに stl: と付加せざえるをえなかったわけだ。
で、今回、衝突に対処するためのパッケージの機能をちゃんとおさらいして、どうにかしようと考えた。
最適化で困っている
2015 年 12 月 24 日
数日前から、CL-STL をコンパイルした時に大量に出るコンパイラノートをなんとかしようと頑張っている。大抵、「宣言が足りないから最適化できない」という類のモノなので、それは確認しながら宣言を追加する。しかし、簡単に解決できない問題にでくわしてしまった。今回はそんな話を少し。
STL書籍の掲載コードをCL-STLで書いてみよう-25
2015 年 12 月 22 日
次いこう。「第46項:アルゴリズムのパラメータとして関数の代わりに関数オブジェクトの使用を考えよう」から。もう何度も書いている、ファンクタの性能のお話。
STL書籍の掲載コードをCL-STLで書いてみよう-24
2015 年 12 月 21 日
前回に続いて、「第45項:count、find、binary_search、lower_bound、upper_bound、およびequal_rangeの違いを理解しよう」から少しだけお釣り拾い。そう、ほんの少し。
STL書籍の掲載コードをCL-STLで書いてみよう-23
2015 年 12 月 17 日
気がついたらもう10日も放置しているこのシリーズ。そろそろ Effective STL の話は終わりにしたいので頑張るとしよう(その後何をやるか決めてないのだけど)。今回はタイトルが長いな。「第45項:count、find、binary_search、lower_bound、upper_bound、およびequal_rangeの違いを理解しよう」から。
非順序連想コンテナとコンストラクタオーバーロード
2015 年 12 月 11 日
先日書いた通り、STL の非順序連想コンテナ(要するにハッシュコンテナ)を CL-STL に導入するための作業を始めている。今回はそれで困った(困っている)ことについて少し。
vectorとdequeとfindとlower-bound
2015 年 12 月 09 日
前回書いた内容から、ソート済みのランダムアクセスコンテナに対する find と lower-bound の比較、および配列に対する内部的な最適化の効果が気になってきた。今回はこのへんをなんとなく。
STL書籍の掲載コードをCL-STLで書いてみよう-22
2015 年 12 月 08 日
まだちょいちょいと直すべきところがみつかる、CL-STL。そして裏では unordered系連想コンテナの実装に着手しはじめてしまってちょっと後悔中。それでもこの連載(?)は続ける。今回は、「第44項:アルゴリズムより同名のメンバ関数を優先して使おう」から。コードはちょっとだけ。
思い出したのでファンクタを再び
2015 年 12 月 05 日
2 年くらい前、まだ現在のかたちになる前の CL-STL で、ファンクタ呼び出しのパフォーマンスについてぐだぐだ書いていた記事があった。それを読み返していて、現状はどうなっているのか、そこが気になった。今日はそんな話。
STL書籍の掲載コードをCL-STLで書いてみよう-21
2015 年 12 月 04 日
昨日、「ひとまず1回で終わらせることができたようだ」などと書いたが、あれば誤りだった。最後に書いておきたいことがあったのに忘れていたのだ。今日はそのおつり拾い。
STL書籍の掲載コードをCL-STLで書いてみよう-20
2015 年 12 月 03 日
なんか面倒になってしまったので、Effective STL のファンクタの残りはやらないことにした。その先に行こう。「第43項:独自に作成したループよりアルゴリズムの呼び出しを優先して使おう」だ。この項はけっこう長いので、数回に分けることになるかもしれない。
STL書籍の掲載コードをCL-STLで書いてみよう-19
2015 年 12 月 02 日
今回は、Effective STL の「第40項:ファンクタクラスを変換可能にしよう」を。なんていうか、まぁあまり面白くない感じになってしまったので血圧低めで流していこう。
STL書籍の掲載コードをCL-STLで書いてみよう-18
2015 年 11 月 24 日
いよいよ今回からファンクタの話に入る。前回まででざっくりと説明した通り、ラムダ式やクロージャで大体カタがつくことを考えると不毛な話になりそうだ。とりあえず、Effective STL の「第39項:述語を純粋関数にしよう」をやってみようと思う。
CL-STLにおけるファンクタの仕組み-2
2015 年 11 月 14 日
前回の続き。CL-STL にあるいくつかのファンクタクラスを実際に見ていこうと思う。
CL-STLにおけるファンクタの仕組み
2015 年 11 月 08 日
さて、今回は CL-STL におけるファンクタの仕組みを説明してみよう。いささか毛深いのでうんざりされないことを祈りつつ。
STL書籍の掲載コードをCL-STLで書いてみよう-17
2015 年 11 月 05 日
今回は、愚直に構造体とクラスで作成した前回のコードを変更し、ラムダ式で十分に目的を達することができることを示そうと思う。点はコンスセル、ファンクタはラムダ式だ。
STL書籍の掲載コードをCL-STLで書いてみよう-16
2015 年 11 月 03 日
今回はアルゴリズムの話の最後。結構大物だ。第37項、「範囲に関する要約情報を取得するには、accumulateまたはfor_eachを使おう」をやってみよう。今回は、初めてファンクタクラスを作成する。次回以降はファンクタの話になるので、一足先にうんざりして頂けることと思う(何言ってる)。
STL書籍の掲載コードをCL-STLで書いてみよう-15
2015 年 10 月 30 日
アルゴリズムの話がもう少し続く。今回は、第36項、「copy_ifの正しい実装について理解しよう」をやってみよう。
STL書籍の掲載コードをCL-STLで書いてみよう-14
2015 年 10 月 28 日
今回は Effective STL の第34項、「ソート済み範囲を必要とするアルゴリズムに注意しよう」で。コードは少ないけど。
STL書籍の掲載コードをCL-STLで書いてみよう-13
2015 年 10 月 25 日
今回は Effective STL の第33項、「ポインタのコンテナには注意してremove風アルゴリズムを使おう」をやってみよう。
今回の主なトピックは、「ポインタのコンテナで迂闊に remove を使うと、リソースリークするよ」というものだ。これが CL-STL にどう関係するのか。ガベージコレクタが備わっている Common Lisp で、リソースリークの心配は必要だろうか。結論から書いてしまえば、リークの心配はないが後始末の心配はあるよね、という話。そして、単純に同じコードを STL で書けないような状況についても少し。
STL書籍の掲載コードをCL-STLで書いてみよう-12
2015 年 10 月 23 日
連想コンテナの全面刷新が佳境に入っているため、しばらくの御無沙汰となった。今回は Effective STL の第32項、「本当に削除したい場合は、remove風アルゴリズムの後にeraseを使おう」をやってみよう。
STL書籍の掲載コードをCL-STLで書いてみよう-11
2015 年 10 月 17 日
さてさて、前回のおつり拾い。Effective STL の第31項、「ソートの選択肢を知っておこう」の残りの話を。
STL書籍の掲載コードをCL-STLで書いてみよう-10
2015 年 10 月 16 日
今回は自分でも始める前からおっかなびっくり、Effective STL の第31項、「ソートの選択肢を知っておこう」から。
STL書籍の掲載コードをCL-STLで書いてみよう-9
2015 年 10 月 14 日
引き続き Effective STL、今回は第30項の「出力先範囲の大きさを確認しよう」から。
STL書籍の掲載コードをCL-STLで書いてみよう-8
2015 年 10 月 12 日
この一連の記事を書いていると、どういうわけだか CL-STL のバグにでくわすことが多い。そうなると、なんだかテストをやっているような気分になる。まぁこれまでのテストが不十分だって話だけどな。引き続き Effective STL、今回は第5項の「単一要素メンバ関数より範囲メンバ関数を使おう」から。
STL書籍の掲載コードをCL-STLで書いてみよう-7
2015 年 10 月 09 日
連想コンテナの再実装を裏でやりつつ、引き続き「Effective STL」のコードを CL-STL で書いていこう。今回は、第27項、『コンテナのconst_iteratorをiteratorに変換するには、distanceとadvanceを使おう』が対象。今回のもコードは少なめ。
連想コンテナのやり直し
2015 年 10 月 07 日
9/21 に書いた通り、連想コンテナがバグっている。赤黒木の実装に関わる部分なのだけれど、追い詰めていくと根本的な問題であることがわかり始めてきた。そこで出直しをしてしまおうかというのが今回の話。
moveにも問題ありか
2015 年 10 月 03 日
CL-STL には、swap 以外に get-setf-expansion を使っている場所として move マクロがある。ということは、当然同じ問題があることが予想されるわけで、なんていうか、こう‥‥‥あぁ面倒臭いなもう。頑張ろう。
swapにバグがあった
2015 年 10 月 02 日
昨日みつけたバグについて確認しよう。何がいけないのかはわかっている。そして、最初のうちはどう対処したものやら皆目見当がつかなかった。これを書いている現時点ではどうにかなったものの、もっと良い解決方法がないものかと思っている。
STL書籍の掲載コードをCL-STLで書いてみよう-6
2015 年 10 月 01 日
10月になっちゃったなぁ。引き続き、「Effective STL」のコードを CL-STL で書いてみよう。今回は、第17項、『余分な容量を取り除くには「swap技法」を使おう』が対象。今回のもコードは少なめ、だがまたバグを踏んだ。
STL書籍の掲載コードをCL-STLで書いてみよう-5
2015 年 09 月 30 日
今回は、「Effective STL」の第14項、「reserve を使って不必要な割り当てを避けよう」のコードを CL-STL で書いてみる。コード量も少ないし、今回は力を抜いていこう。
配列要素のアドレス取得からポインタを生成する話
2015 年 09 月 29 日
Effective STL のコードを CL-STL で実装する話はちょっとおやすみ。今回は、配列要素の参照に対してアドレス取得するような構文でポインタオブジェクトを生成する、という最近の変更の話だ。
STL書籍の掲載コードをCL-STLで書いてみよう-4
2015 年 09 月 28 日
実は、「Effective STL」の第9項、「消去オプションは注意して選択しよう」のコードを CL-STL で書いてみる試みはまだ終わっていなかったりする。残りは、ループの内部でログを出すという話。
STL書籍の掲載コードをCL-STLで書いてみよう-3
2015 年 09 月 22 日
とりあえず見つかった問題については対処した(つもり)なので、続きをやろうと思う。今回は、remove-if のイメージで連想コンテナから要素を除去する話。
おいおい、連想コンテナがバグってるよ
2015 年 09 月 21 日
昨日の続きを書いていたら、なんとまあバグを見つけてしまった。テストが足りなかったということだな。
STL書籍の掲載コードをCL-STLで書いてみよう-2
2015 年 09 月 20 日
昨日に引き続き、Scott Meyers の「Effective STL」から。今回は、第9項の「消去オプションは注意して選択しよう」のコードを CL-STL で書いてみようと思う。
STL書籍の掲載コードをCL-STLで書いてみよう
2015 年 09 月 19 日
Scott Meyers の「Effective STL」、第47項の「書き込み専用コードの作成は避けよう」に出てくる、以下のコード例を CL-STL でやってみた、という話。
mapとmultimapのキー変更を禁止する話
2015 年 09 月 18 日
そもそも Common Lisp には const という考え方はないみたいだ。だがなんとかして塞ぐことが必要な部分もある。今回は map と multimap の話。
githubにCL-STLをアップし(て)ました
2015 年 09 月 17 日
9月になってしまっている。そしてまたもや遅すぎる事後報告。なんにせよ、必死こいて頑張りましたよ、という話。
作業がてんこ盛り
2015 年 08 月 07 日
どういうわけだか、この期に及んで CL-STL の作業が噴出している。最近追加されたタスクは、大体以下のようなモノだ。
- 完了:一部のアルゴリズムにポインタを渡せない(仕様バグ)
- 完了:コンスリストのための反復子(機能追加)
- 完了:pair を独立クラスにする(実装変更)
- 完了:コンスリストのサポート拡充(機能追加)
- 完了:forward-list の反復子を cons-iterator 派生にする(仕様変更)
- 着手:alrogithm と numeric のモジュール構成整理
- 待機:アルゴリズムを cons-iterator に対しても特化する
- 待機:アルゴリズムテストへの配列とコンスリスト追加
- 待機:アルゴリズム以外のメソッドにポインタを渡せない(仕様バグ)
- 待機:0x11 で deque の insert に空シーケンスを渡すと nil が返る(実装バグ)
CL-PREFABのCL-STLへの切り替え
2014 年 12 月 09 日
気がつけば12月。今年も色々頑張ってはいるのだが、脱線ばかりで彷徨っている感が否めない。そんな中、それでもこれは今年中に終わらせたぞ、と言えそうな案件がようやくひとつ。CL-PREFAB の CL-STL への移行だ。うん。
テスト、やってます
2014 年 09 月 19 日
なんか新しい職場は理不尽に忙しい。残業というのは遅れを取り戻すためにやるもの、と思っている自分としては、自分が遅れているわけでもないのに残業せざるをえないほど仕事量が多いというのはスケジューリングやマネジメントの問題だとしか考えられない。とはいえ、そう考えていても問題は解決しない。さっさと見切りをつけて次のを仕事を探すしかないだろうか。
それはそれとして、STL の Common Lisp への移植の話。そんな中でもしぶとく作業を続けています、という話。
CL-STLとNGL
2014 年 07 月 12 日
休みに入ったら入ったで、色々忙しい。今日は CL-STL の現状と、同じく STL の移植(っぽい)ライブラリである NGL の今後の話。
ファンクタの0x11対応 - 7
2014 年 06 月 19 日
さて、ファンクタの 0x11 対応という意味ではまだやることはたくさんあるのだけれど、bind マクロの話は前回でほぼ終了。今回は、相変わらず気になる性能の話。
ファンクタの0x11対応 - 6
2014 年 06 月 18 日
人間、頑張ればできる‥‥‥というが、頑張った結果として成功したのに、それが単なるまぐれのような気がしてならないという時というのがあるものだ。先日から書いている bind マクロの問題、解決してしまった。
ファンクタの0x11対応 - 5
2014 年 06 月 18 日
ファンクタの C++11 対応の話、今回は、いよいよ bind の実装を見ていこう。というか、誰か助けてと言いたい今日この頃。
ファンクタの0x11対応 - 4
2014 年 06 月 17 日
ファンクタの C++11 対応の話、まだまだ続く。今回は、bind が一体どんなもので、なぜそれに悩まされているかについて。上手く説明できる自信はないのだけれど、書いてみよう。
ファンクタの0x11対応 - 3
2014 年 06 月 17 日
前回、「都度レキシカルクロージャを作って返すのは遅い」と書いた。まぁ容易に想像できることではあるのだが、では、どれくらい‥‥‥? 今回はそういう話。
ファンクタの0x11対応 - 2
2014 年 06 月 16 日
「続きは明日」とか書いておきながら、数日放置してしまった。先日書いた通り、ぶつぶついいながらファンクタ機構の拡張をしている。今回は現状を説明できるところまで書く‥‥‥つもり。
ファンクタの0x11対応
2014 年 06 月 12 日
C++11 では、functional の unary_function や binary_function は deprecated となっている。binder1st とかもだ。自分はかなり長いことこのことを見落していた。新しいコンテナとか、アルゴリズムとかに気をとられすぎていたのだ。しかし、ようやくとはいえ気がついた。気がついたからにはなんとかしなければならない。どうやってなんとかするか、はて。
総称関数メソッドのパフォーマンス確認
2014 年 05 月 22 日
C++ でいうところの演算子オーバーロード、例えば operator< は CL-STL の世界では opr< となる。これは総称関数なので、その解決にかかるコストは実行時に負担しなければならない。ではそのコストは‥‥‥? というのが急に気になり始めた。というのも、このままいくとアルゴリズムに渡す比較子のデフォルトも opr< とかになるからだ。以前にも似たようなことをやった気がするが、今回改めて試してみる。
本気で move について考える - 5
2014 年 05 月 02 日
行き詰まった感じが募ってくると、「まぁ手を動かしてみようや」とか考えてしまうのはいくつになっても直らない。そんなわけで、結局 operator-move とかは中途半端に実装してしまった。もちろん、前回書いたような悩みは継続しているわけで。
代入と move:気付いたことをいくつか
2014 年 04 月 30 日
ごちゃごちゃとコードをイジっているうちに、気がついたら代入構文を実装してしまった。反省しつつ、気付いたことを。
本気で move について考える - 4
2014 年 04 月 24 日
考えなきゃならないことはまだまだある。というか、実際にソースファイルに手を加えずにここまで検討を続けたのって初めてかも。それだけ自信がないんだな。
本気で move について考える - 3
2014 年 04 月 23 日
さて、できるだけのことはやったつもり。では、できたこととできなかったことを。
本気で move について考える - 2
2014 年 04 月 22 日
昨日はとりあえず動作するコードを書くだけで精一杯だった。今日はその内容を見ていくことことにする。
本気で move について考える
2014 年 04 月 21 日
さて、move について本気で考えなければならないところまで来てしまったようだ。C++ 11 の新機能の中でも、自分にとっては一番得体の知れない move。そんな気がするだけかもしれない move。さて、どうなることやら。
代入と move:ここまでのまとめ
2014 年 04 月 19 日
代入の実装に関連して、出力反復子から(擬似的に)値を取得することがでなければならず、また move の実装に関連して入力反復子へ値を設定できなければならない‥‥‥っぽいことがわかってきた。しかし、自分でもこれらの問題について考えていると何がなんだかわからなくなってくる。ここらへんでちょっとまとめてみよう。
代入から move へ
2014 年 04 月 18 日
前回の最後で、今検討している「代入」の方式では出力反復子から「値を取得」できなければならないことが判明した。今回はこの「代入」の問題から展開(右往左往?)した思考の結果、入力反復子に「値を設定」できなければならないことがわかったところまでを書いておきたい。
演算子オーバーロードについても考える - 3
2014 年 04 月 17 日
以前の続き。まだ頭はちゃんと冷えてはいないが、忘れるのも嫌なので。自分は、前回の最後で以下のように書いた。
‥‥‥(略)‥‥‥そしてこのような場合、設定すべき場所にあるモノと、設定すべき値はまったく別のタイプかもしれないのだ。STL では静的な型チェックがあるが、Common Lisp 上で動作する CL-STL にはそんなものはない。だから、前述の operator= を defmethod する場合、同じタイプ同士で特定化するだけではいけない。たとえばコンテナの場合、同じタイプ同士なら「内容のコピー」をし、それ以外ならば別のことをしなければならないだろう。コピー先が nil だったらコンテナの複製を作ることになるかもしれないし、それ以外であれば例外を投げることになるかもしれない。
とりあえずのところ、上記のことは置いておこう。それよりも先に、本気で setf とは別の「代入」を導入したらどうなるのか、それを探っていきたい。
脱線して swap について
2014 年 04 月 16 日
前回書いた代入演算子の実装方法を眺めていたら、あきらめていた swap がなんとかなることに気付いた。今回はこれについて。
演算子オーバーロードについても考える - 2
2014 年 04 月 15 日
昨日はなんだかもごもごした感じで終わってしまったが、それは書きながら別のことに気付いてうろたえていたからだ。今日は、ひとまずわかっていることを書いていく。
演算子オーバーロードについても考える
2014 年 04 月 14 日
数日前の件については、結局メソッドを増やす方法で対処した。これで list-sort とかいった無様なメソッド名がかなり減ったが、まだある。それは C++ で言うところの演算子オーバーロードだ。これも同じ方法で対処しようと考えたものの、ちと厄介な方向に行きつつある。今回は、それについて。
マクロと総称関数で関数オーバーロードを真似る - 2
2014 年 04 月 10 日
以前、C++ の関数オーバーロードを Common Lisp のマクロと総称関数を使って真似る、という話を書いた。あれから、結局その方法を採用してしまったのだけれど、まぁやっぱり想定していなかったことは起こるわけで。それについて、今回もまたその是非に自信のない対処のことを書くとしよう。
リードマクロでinitializer_listを実現する
2014 年 04 月 07 日
C++ 0x11 では、initializer_list という仕組みが追加された。これにより、std::vector のようなものでさえ以下のように初期化できるようになった。
std::vector<int> v = { 0, 1, 2, 3, 4 };
で、これをどうにかして CL-STL に取り込みたいと思うわけだ。今回はそれについて試したことについて。
マクロと総称関数で関数オーバーロードを真似る
2014 年 04 月 06 日
Common Lisp の総称関数は素晴らしい。が、不便だと思う部分がないわけでもない。そのひとつが、C++ でいうところの関数オーバーロードができない(っぽい)ところだ。関数オーバーロードであれば引数の数からして全然違うような同名の関数を定義できるが総称関数の仕組みではできないように見える。今回は、これについて実験してみたことについて少し。
*features*で条件付きコンパイル
2014 年 04 月 05 日
Common Lisp では標準で *features* というダイナミック変数があって、環境や処理系の情報を格納している。で、#+ や #- というリードマクロによってそれらの情報に依存したことができる。
で、以前からやりたいと思っていた条件付きコンパイルみたいなことをそれでやってみることにした。それも、起動時点で *features* に入っている値を使うのではなく、自分で値を追加して使うというものだ。その是非については正直自信がないのだけれど。
minmax_element
2014 年 03 月 09 日
ファンクタの件も一応カタがついたので、新しいアルゴリズムを少しずつ実装している。今日は、minmax_element について。
‥‥‥というか、今回のエントリは一度書き上げたものを操作ミスで完全に削除してしまい、全部書き直しをするハメに陥った。使い慣れたつもりの Emacs だが、dired で削除するとゴミ箱にはいかないから二度と戻ってこない。気をつけないと。
ファンクタの悩み - 4
2014 年 03 月 08 日
前回からの続き。
前回までで、ひとまずパフォーマンス面の心配は杞憂だったと考えることにした。そして、なぜファンクタの値渡し(を模倣するためのコピー)が必要なのかについても確認した。では、これからどうするのか、という話。
ファンクタの悩み - 3
2014 年 02 月 22 日
前回からの続き。
話を戻そう。そもそも、ファンクタを値渡ししなければならない理由とは何か。それをしないと、どういう局面で STL と挙動が異なってしまうのか。今回はそれについて。
ファンクタの悩み - 2
2014 年 02 月 20 日
前回からの続き。
とりあえず、ファンクタの値渡しを模倣するために CLOS の使用を模索し始めた。今回は、ちょっと心配なパフォーマンスを調べてみようという話。
ファンクタの悩み
2014 年 02 月 19 日
CL-STL のマニュアルを書いていて気付いた。そういえば、ファンクタが物凄くおろそかになっている。
というか、以前に一度「もうクロージャでいいじゃん」と思い切ってしまって、それっきりだったのだ。何を思い切ったのかというと、クロージャでは STL における関数オブジェクトのコピーの挙動を完全には模倣できないことだ。今回(と以後数回?)はこれについて書くことにしよう。
マニュアルという苦行
2014 年 02 月 09 日
CL-STL のマニュアルを書いている。目下のところ、想定される読者は自分ひとりだけ、という悲しい行軍。
まぁ、想定される読者が自分だけだと言っても、現時点でも自分で使う際にはソースコードを見て使い方を確認したりしているので、マニュアルを作成することには十分意味はあるんだけどな。
CL-STLの話
2013 年 10 月 29 日
以前書いたとおり、Common Lisp をがりがりと書いている。やっているのは CL-STL というライブラリの開発で、C++ 標準ライブラリの STL を移植するというものだ。
結局CLOSで書き直す
2013 年 10 月 27 日
気がつけば半年以上放置。
今年の夏くらいから、STL の Common Lisp への移植は大方完成していた。しかし、全てをレキシカルクロージャで実現するデザインを捨てて CLOS で書き直すという途方もない決断をしてしまう。それで、必死こいているわけだ。現在はアルゴリズムは一応書き終えて、コンテナをイジり回しているところ。
でも、この weblog を放置している理由はそれじゃない。毎日往復5時間という通勤に疲れ果てているからで、コーディングも電車の中でしかやれない。ふぅ。
久し振りにここに投稿するにあたって、古い記事を読み返してみたが、Palm 向けのソフトウェアを書いていた頃と今現在に間には、驚くほど何の繋がりもない。そろそろ project-enigma は店閉まいかな、とも思う。いくらなんでも Palmware はもう並べておく必要もないだろうし。
NGL version 0.75.001-001
2012 年 01 月 30 日
実は、もう一週間近く前のことだけれども、ひっそりとリリースしていた。そしてこれは project-enigma とは別のサイトで公開している。
http://www.architect-matsuoka.jpn.org/ngl/
いまさら後悔していること
2011 年 06 月 02 日
VBGeneric では、メソッドを跨いで渡された反復子を移動させる場合、コピーを明示的に作成せねばならない。その理由は、Visual Basic のオブジェクト渡しの方式にある。オブジェクトの引数渡しは全て参照渡しになるため、オブジェクトの変更は呼び出し元に波及する。そして、反復子もオブジェクトだから、その移動が呼び出し元に波及しないようにするには、どこかでオブジェクトのコピーを作る必要がある。今回はそこにある「無駄」の話。
Collection を使用したコンテナを考えてみる
2011 年 05 月 28 日
C++ 0x で追加される for の新しい使い方から、そんなことを考えた。
追加検討中のコンテナ
2011 年 05 月 24 日
C++ 0x で追加されるコンテナとして、以下のものがあるらしい。
- forward_list
- unordered_set
- unordered_multiset
- unordered_map
- unordered_multimap
これを VBGeneric に取り込むかどうかで、しばらく悩んでいる。
無様だけど Lambda
2011 年 05 月 22 日
Visual Basic にはオペレータオーバーローディングのための仕組みがない。だから、これについては完全にスルーするつもりだったのだ。
コンテナ初期化の方式を追加
2011 年 05 月 22 日
Tuple の初期化方法から、コンテナの初期化方法がもうひとつあることに気付いた。
Numeric.Iota
2011 年 05 月 21 日
昨日書き忘れていたが、追加したアルゴリズムには Numeric.Iota があった。以下のようなもので、これも C++ 0x への対応だ。
Public Sub Iota(itr1 As ForwardIterator, _ itr2 As ForwardIterator, ByVal v As Long)
アルゴリズムの追加
2011 年 05 月 18 日
VBGeneric イジりは続く。
Tuple の追加
2011 年 05 月 15 日
5年振りに、VBGeneric をイジろうと思いたった。
今回やろうと思ったのは、Tuple クラスの追加だ。C++ 0x に追加される予定だということで、しばらく前から気にはなっていた。そして、ちょっと変則的ではあるものの、VBGeneric に取り込むことが可能だという判断ができたので、今回手を動かしてみたわけだ。
VBGeneric version 1.03.356.001
2006 年 03 月 01 日
さて、陰郎個人としてはもっとも思い入れがあるにも関わらず1番不人気かもしれない作品、VBGeneric の4ヶ月ぶりのアップデートである。今回はファンクタの仕様変更ということで、旧バージョンとのバイナリ互換性はない。つまり、旧バージョンを使用してコンパイルしたものについては、リコンパイルが必要ということだ。
Functor、でいいのか?
2006 年 02 月 17 日
えぇと、VBGeneric の話ですごめんなさい(と先に謝っておく)。
いきなりだが C++ の演算子オーバーロードをご存知だろうか。たとえば、自作のクラス Foo に対して以下のような大域比較演算子を定義しておくと、
bool operator==( const Foo& foo1, const Foo& foo2 );
...Foo のオブジェクトに対して比較演算子 == を使用することができるようになる。演算子オーバーロードは、クラスを組み込み型のように扱えるようにするための仕組みだ。その他にも色々な演算子がオーバーロードできるようになっているが、その中には関数呼出し演算子(て名前だったかな)もある。これは、オブジェクトを関数ポインタのように扱えてしまうというものだ。
ど忘れのブルース
2006 年 01 月 16 日
...「ブルース」という部分に意味は無い。昨年 11/01 にアップデートをリリースした VBGeneric ライブラリ。あれ、Vector に登録してあったのだが、なんと、2ヶ月半もの長きに渡って更新の連絡をするのを忘れていたのだ。嗚呼。
VBGeneric Version 1.02.352.001
2005 年 11 月 01 日
この開発日記を読んでくださる皆さんは、ほとんどが Palm 関連で訪れてくださる方だと思っている。そのせいか、Palm 以外の話題を書くのは微妙に気が引けるのだが、もともとは陰郎の開発日記なので Palm の話題に限る理由は何もない。読んでも面白くない方もいるだろうとは思うが、ひとまず申し訳ない。
2005年の VBGeneric、そして怒り。
2005 年 10 月 30 日
一ヶ月ほど前に、VBGeneric という過去の作品について回顧録のようなエントリを書いた。そう、過去の作品。そう自分では思っていた。今後は手を入れるようなことも無いだろう。自分としても日常的な使用では満足しているし...と、本当に思っていた。
しかし、メールが来たのだ。今日、改善要望のメールが。まずはその内容について紹介しておこう。
ポケットの中のカビ臭い狂気
2005 年 09 月 25 日
Palmware 開発を始める前、僕はプログラマ向けのライブラリ作成をメインに活動していた。といっても、それで飯を食っていたとか、その世界で名を上げたとかいうわけではない。まぁそれでも自分なりに真剣にやってはいたわけだ。あの頃の自分の無謀さは、思い返しただけでも果てしない気持ちになる。回顧録臭いけれども、ちょっとだけ、昔を思い出しながら書いてみよう。
Copyright(C) 2005-2021 project-enigma.
Generated by CL-PREFAB.