カテゴリ「Common Lisp」のlog
>> Site top >> weblog >> カテゴリ別アーカイブ >> カテゴリ「Common Lisp」のlog
最終更新日付:2013/11/17 01:43:26
SBCL なら sequence を自作できるらしい
2017 年 07 月 30 日
Common Lisp Recipes を読んでいて知ったことだ。SBCL で sb-sequence パッケージの総称関数を適切に定義することで、自作のクラスを sequence にすることができるらしい。CL-STL のコンテナをそうできたら素敵じゃないか。
Rubyの前に、OnLisp
2016 年 12 月 26 日
うん、Rubyの本を読むつもりだったんだけど、最近 Lisp の本を読んでないなと思ったので。
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 あたりに移動しようかと考えている。今回はそんな話。
CL-OPERATORにreferenceを追加しようかな
2016 年 05 月 28 日
今回は、CL-OPERATOR に導入しようかと思いついた reference 機能について。これは C++ における「パラメータの参照渡し」を模倣するものだ。こんなことをしようとすると Lisper の方々に取り囲まれて四方からマサカリを投げ付けられてしまうかもしれない。「多値が返せるのに、パラメータ渡ししたモノを変更する仕組みなんて!」というワケだな。わかってますって。使わなければ害はないモノなのだし、まだ導入すると決まったワケでもない。とにかく書くだけ書いておこう。
Shibuya.lisp#39における個人的な反省会
2016 年 04 月 29 日
昨日、Shibuya.lisp#39 にて CL-STL の紹介をさせて頂いた。人前で話す(というか人と話す)ことがほとんどない自分は、そうは見えなかったかもしれないがガチガチに緊張していた。スライドにあわせて話す内容を書き下した4枚のA4用紙を開く心の余裕もなく、ずっと丸めて握っていた気がする。今となっては何を話したのかもはっきりとは覚えていない。困ったものだ。
で、いくつか質問/意見を頂いたわけだが、どうもちゃんと答えられた気がしない。覚えている限り、再度整理してみようかと思う。ただし、以下はあくまで(覚えている限り)どのような話題が出たかについて自分なりに整理し、再構成したものだ。これを読んでいる方は誰がどんな質問をしたのか覚えているかもしれないが、「誰某はそんな言い方しなかった」というような捉え方はしないで欲しい。では、始めよう。
一応持ってる
2016 年 04 月 25 日
Amazon の購入履歴を確認したら、購入したのは 2013年2月だった。川合 史朗さんの翻訳ですね。
便利だねコンパイラマクロ
2016 年 01 月 10 日
数日前に少し書いた、iostream ライブラリの Common Lisp 移植(っぽい)ライブラリである CL-IOSTREAM、今回はやっぱり気になるあの話だ。
思いつきでもないiostream
2016 年 01 月 08 日
随分前から実現できないかな—、と思っていたのがストリーム入出力。もちろん Common Lisp でだ。C++ 標準ライブラリの iostream と同じものができたらいいなという野望があるものの、そもそも自分は iostream のことを良く知らない。もう STL に夢中過ぎて、C++ 標準ライブラリの他の部分には全然目が行ってなかったわけでもうなにがなんだか。
そんなわけで、先日言及した『C++標準ライブラリ チュートリアル&リファレンス』を読んでおさらいをするところから。今回は、その道すがらどうにか動き始めた CL-IOSTREAM の話。
Linux+Emacs+SLIME+ASDFでハマった話
2016 年 01 月 03 日
まぁ毎年 Linux ディストリビューションをアレコレと試すんだ新春は。恒例行事だな。でも、大体途中でやめてしまう。それは、Windows + Emacs + Cygwin でコト足りてしまうからで、昼間のお仕事の関係上 Windows を手を切れない自分としてはそれが丁度いい立ち位置だったりもする。
ところが今回、gNewSense 3.1というのを試してみて、なんだかとてもいい感じなのだ。適度に枯れた感じのデスクトップといい、必要なモノがほぼ全部リポジトリにあるところといい、気に入った。調子に乗って Emacs + sbcl + SLIME + ASDF までインストールし、自前の CL ライブラリを使おうとした時点でハマった。今回はそんな話。
最適化で困っている
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 が返る(実装バグ)
github、始め(て)ました
2015 年 08 月 06 日
8月になってしまった。思わず 8 を全角で書いてしまうほど慌てている。今回は、色々あって github のアカウントを持ちました、という話。
インクリメント/デクリメント演算子の変更
2015 年 07 月 12 日
CL-OPERATOR、現在の operator_++ および operator_-- の設計では、integer に対する実装ができない。これをなんとかしたいと思ったわけだ。で、なんとかしてしまったという話。
CL-OVERLOADとCL-OPERATORとCL-STL
2015 年 07 月 04 日
Common Lisp をやり始めてからわりとすぐだったと思うけれど、C++ 標準ライブラリの STL を Common Lisp に移植する、という作業をやっていた。というか、やっている。Let Over Lambda の影響もあって、最初はコンテナやら何やらのクラスを全てクロージャで作成していたが、結局全てを捨てて CLOS と総称関数を土台にした設計でやりなおした。それが CL-STL と呼んでいる、もう何年イジっているかもわからないライブラリだ。
前回や前々回書いていたのは、そこから基盤になるような機能を抽出したライブラリで、CL-OVERLOAD と CL-OPERATOR という。今回は、このあたりのことについて少し。
ずっと悩んでいたこと
2015 年 07 月 03 日
ずっと以前から、通らないテストコードがあって困っていた。困っているというのは、理由がわからなかったからだ。今回、これまた定かでない経緯でもって解決したので記録しておこうと思った次第。
外側で定義したsymbol-macroletがdo内部で展開されない
2015 年 06 月 25 日
symbol-macrolet でシンボルマクロを定義して、そのシンボルを do の内部で使用したら展開されないという経験をして困っている、という話。
コンパイラマクロとCL-OVERLOAD
2015 年 05 月 19 日
ふと気がついた。自分で作って使っている CL-OVERLOAD というライブラリ、コンパイラマクロで実現する方がキレイじゃないだろうか? 今回はそんな話。
withマクロの改善
2015 年 05 月 09 日
前回の with マクロはパフォーマンスに問題があった。今回はそれを改善する措置について。
tupleにして、あとwithマクロ
2015 年 05 月 04 日
結局、binder という名前はヤメて tuple にした。でもって、まだ適当命名だけれども手短かに with というマクロを導入。
binderにするか、tupleにするか
2015 年 05 月 03 日
嗚呼、5月になってしまった。SVG ツールは作り続けているけれど、ここに書くようなことがなくて困っている。今回はちょっと脱線して、いくつかのデータをまとめるためだけのデータ構造をクロージャで作成するマクロについて。というか、そんなモノは既存でいくらでもあるのだろうけれど、まぁこういうの作るのが楽しいので。
lambdaでクラス - 3
2014 年 11 月 26 日
CL-CLASS というライブラリ、使い始めた途端におかしなところに気付く。なんとまぁ、コンストラクタの内部からパラメータにアクセスできないとな。
lambdaでクラス - 2
2014 年 11 月 18 日
最近、この log に何も書いていないな。以前のアレ、最近またイジり始めている。今回もその話。Common Lisp のマクロでもって C++ っぽいクラスを作れる CL-CLASS というライブラリ。
lambdaでクラス
2014 年 11 月 03 日
10月は何も書かずに過ぎさってしまった。そのため、とりあえずの適当な近況報告でお茶を濁すことにする。要するに埋め草だ。しかも、以前に同じようなことを書いたような気がしても確かめもしない。そんなもので上手に濁るといいけど。
ファンクタの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< とかになるからだ。以前にも似たようなことをやった気がするが、今回改めて試してみる。
閑話休題:最左の0ビットを探す
2014 年 05 月 06 日
Twitter で、「最も左にある0のビットを探すにはどうしたらいいだろう」と書いている方がいらっしゃったので、自分なりに考えてみることにした。最初は C で書いて、それを Common Lisp に持っていく。つもり。
本気で 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* に入っている値を使うのではなく、自分で値を追加して使うというものだ。その是非については正直自信がないのだけれど。
Common Lisp のコンディション機構-3
2014 年 03 月 16 日
前回まででコンディションの通知と捕捉は終わりにして、今度は再起動について。
Common Lisp のコンディション機構-2
2014 年 03 月 15 日
前回は、コンディションの通知と捕捉だけ書いた。再起動についても書きたいが、今回は前回の補足を先に。
Common Lisp のコンディション機構
2014 年 03 月 14 日
Common Lisp にはコンディションという仕組みがある。C++ などの例外機構に似ているが、もっと柔軟なものだ。正直これまでおろそかにしてきたが、ここらでちゃんとおさらいしておこうと思った。まぁおおむね『実践 Common Lisp』で学んだことをなぞっているだけなのだが。
CygwinとSBCLを64bitに
2014 年 01 月 26 日
結局ノートPCは買い替えたのだけれど、ついでに思い切ってやってみた、という話。
イチから構築するのは随分と久しぶりなので、SBCL については 1.1.12 の 64bit 版にしてみた。そして、「あ、そういえば‥‥‥」という感じで Cygwin も 64bit 版にしてみようそうしようということになった。なったのだが、Cygwin インストールの最中に気付いたことがあった。
CLISP が見当らないじゃないか。
手の届かないところ
2014 年 01 月 22 日
すでに2ヶ月も前の話のだけれど、この weblog で、Common Lisp を使った最初の仕事の話を書いた。それが、先日ようやく納品(?)となった‥‥‥なったのだが。
SBCLのdefconstant問題
2013 年 11 月 27 日
ずっと以前から、SBCL で defconstant を使うとコンパイル時にエラーになるという問題に悩まされていた。プロンプトに対してひたすらに Go ahead を選択し続ければ一応はコンパイルを続行することはできるが、面倒臭くて仕方がなかった。で、これが恥ずかしい話なのだが、マニュアルをちゃんと読めばすぐに解決できることだったのだ。ようやくそれに気付いて修正したので、一応記録として残しておこうと思う。
マクロとメタプログラミング
2012 年 11 月 14 日
C++ で考えるのがデフォルトの人間は、総称とかジェネリックとかメタプログラミングというとすぐに template が頭に浮かぶ。そして、そもそも型付けの弱い言語でメタプログラミングなんてできるのだろうか、と考えるのだ。もちろんできる。C++ のようにはできないというだけのことだ。Lisper の方々が怒り出さないうちに書いておくと、「C++ のようにはできない」というのは Lisp が C++ より劣っているという意味ではない。やり方が違うというだけのことだ。そこに優劣はない(個人的な好みはあるだろうが)。
コンテナまでクロージャで
2012 年 11 月 13 日
しばらくここには何も書かなかったけれど、ずっと Common Lisp をやっている。STL 全体を、可能な限り同じように Common Lisp 上で使えるようにしようとしているのだ。もちろんそれは変な行為だろう。しかし、まずは何かお題を決めてコードを書くこと。それを優先したわけだ。ただ本を読んでサンプルコードをイジり回していても、なかなか言語というものは身につかない。
アルゴリズムとクロージャと - 5
2012 年 10 月 17 日
「こっちの方が速いだろう」と思うものを試すたびにどんどん遅くなっていく。自信をなくしてしまうような経験だが、それはそれでいつか糧になる、と信じてみよう。今度はCLOS を試してみる。
アルゴリズムとクロージャと - 4
2012 年 10 月 15 日
前回まででクロージャを使用した反復子を使ってみたが、リストを直接扱うアルゴリズムよりもかなり遅かった。さらに別の方法を模索してみる。
アルゴリズムとクロージャと - 3
2012 年 10 月 10 日
先日の続き。クロージャ以外の方法を検討する前に、気になっていることを確認した。それは、最初の(リストや配列を直接扱う)実装と、クロージャを使った反復子、それぞれについてリストと配列、合計4種類の実行時間を比べることだ。
アルゴリズムとクロージャと - 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.")))))
アルゴリズムとクロージャと
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.")))))
辿り着いた先
2012 年 10 月 03 日
最近、Common Lisp ばかりやっている。C++ をやり込んだあと、興味をそそられるような言語はこれしかなかった。日本語の情報が非常に少ないのに難儀するが、書籍も書いまくっている。CLtL2 の日本語訳書、Palm Graham の本を2冊、あと他に数冊というところ。
Copyright(C) 2005-2018 project-enigma.
Generated by CL-PREFAB.