いくつか Gauche で書きました。写経がてら。前回読んだ時にあまり書いてないので、揃えておいた方が良いなぁと。
ざっくり書いただけなので、動かないところがあるかもしれません。
今 LET OVER LAMBDA Edition 1.0 と On Lisp を再読しているので、こういうのを揃えていこうと考えています。書きたいものがあるときにすぐに書き始められる状態を作っておかないといけないなぁと思った次第です。
以下コード。
2010/09/14
2010/08/11
Gauche の and-let* と On Lisp の aand
2010/06/20
Common Lisp のなかで最も名前が長いシンボル
On Lisp の後注、P.400 にあるコードを試しに実行してみました。38文字て・・・。
以下の式は, 現在ののパッケージで可視になっているすべてのシンボルを名前の長い順に並べたリストを返す.(以下のコードは本にあったコードに princ を追加したものです)
labels :
onlisp
Lisp は「C 言語並みに速い」「C 言語より速い場合がある」
だそうです。
(CL-PPCRE は、Common Lisp で書かれた正規表現ライブラリ)
On Lisp
On Lisp 後注よりGabriel, Richard P. Performance and Standardization. Proceedings of the First International Workshop on Lisp Evolution and Standardization, 1988, p.60
ある処理系で triangle を試していて, Gabriel は次のことを発見した:「プログラマが C コンパイラにレジスタ割り当ての指示を与えたときと比べても, C 版の反復による実装よりも Lisp 版のほうが 17% も高速だった.」彼の論文では Lisp で実装したほうが C より高速になるプログラムが他にもいくつか挙がっており, なかには 43% も高速になったものもある.
Lisp:よくある誤解
Lisp:よくある誤解 「Lispは高速なプログラムが書けない?」 よりLispでもほぼC並に速いコードを 書くことは可能です。
C並に速いLispコードは見た目も安全性もC並になる
ベンチマーク
こういうベンチマークもあるそうでLet Over Lambda
Lisp の速度について、LET OVER LAMBDA Edition 1.0 では6章で扱っていました。Lisp は速い。本当に速いのだ。
この章では、Lisp が他のあらゆるプログラミング言語よりも速くなり得ること、実は C のような低水準プログラミング言語は、マクロがかけているため、Lisp に対して性能面で不利なことを明らかするつもりである。参考までに LOL の6章の目次はこんな感じ。
- 第6章
- Lisp は速い
- マクロが Lisp を速くする
- ディスアセンブラと仲良くなる
- ポインタスコープ
- tlist とコンスプール
- ソーティングネットワーク
- コンパイラの書き方とベンチマーク
参考
- Lisp:よくある誤解
- LISPは速い - 翡翠はコンピュータに卵を生むか
- ろーてく - ブログ Common Lisp 早い!?
- :: Lispって意外と速い? | 世界の半分~まじかる☆ちきんれーす ::
- LISP ベースの「世界最速」 (と作者が信じる) ウェブサーバ - スラッシュドット・ジャパン
追記
まさか shiro さんのところに valvallow という文字が現れるようなことが起こるとは・・・。すげーな Common Lisp ・・・。
追記2
How to make Lisp go faster than C
という論文が面白いです。
簡単な画像処理をCとCommon Lispで書いて速度を比べるというものですが、
CLの速度の劇的な変化が笑えます。
インタプリタで実行 -> Cの2300倍遅い
コンパイルして実行 -> Cの60倍遅い
型宣言と最適化を付ける -> Cと同等の速度(一部に関してはCより速い)
追記3
LET OVER LAMBDA Edition 1.0 P.75 より(CL-PPCRE は、Common Lisp で書かれた正規表現ライブラリ)
第1に、CL-PPCRE は高速である。本当に高速だ。品質の良いネイティブコードコンパイラでコンパイルすれば、ほとんどの正規表現に対するベンチマークが、CL-PPCRE の方が Perl よりも2倍か、もっと高速だという結果をしばしば示す。そして、Perl の正規表現エンジンは、非 Lisp 正規表現エンジンの中では最高速なものの1つだ。それは C で書かれ、高度に最適化されたエンジンなのである。
labels :
common lisp,
onlisp,
Web
On Lisp 読了
ようやく LET OVER LAMBDA Edition 1.0 に引き続き On Lisp を読み終わりました。これが初級者向けってホントですか。前半はまー、確かにそうでしょうけども。。Lisp 怖い。
個人的におもしろかったのは、
- Paul Graham 節
- 前半の入門的なところ
- ユーティリティ関数のところ
- コードがキレイ
- こういう風にユーティリティを書いていけば良いのかー。
- マクロの導入的なところ
- 「マクロとはこういうものだ」というのが随所に書かれていて、丁寧でわかりやすい
- できること、できないこと、長所、短所、デバッグ方法、ハマりどころ
- やっぱりマクロは難しいんだ
- 「こうやって書いていけば良いよ」
- アナフォリックマクロ
- カッコイイ
- 非決定性
- とてもわかりやすい
- CLOS
- 言うほど異色じゃなくね?(ほんの少ししか紹介されていなかったからかも)
- 付録のパッケージのところ
- パッケージややこしそう。
継続の実装のところは少し期待を裏切られました。あとATN コンパイラと Prolog のところは完全に置いていかれました。
コードがキレイですごく見やすかったです。お手本にしたいコード(当たり前か)。私は先に LET OVER LAMBDA Edition 1.0 を読みました。LOL もすごくおもしろかったのですが内容的にもコード的にも読むのに負荷が高かったです。On Lisp を先に読んだ方が良いのではないかと思います。
「最終的には Prolog を 94 行で実装した.」
Web 版にはないと思われますが、P.393以降の「後注」に以下の様なことが書かれています。
最終的には Prolog を 94 行で実装した. それには以前の章から 90 行分のユーティリティを持ってきて使っている. ATN コンパイラにはさらに 33 行を追加したので, 217 行になる. ただし Lisp の言語仕様上では行という概念が無いので, Lisp プログラムの長さを行数で図ると誤差が大きいことに注意.最後の一文。
ただし Lisp の言語仕様上では行という概念が無いので, Lisp プログラムの長さを行数で図ると誤差が大きいことに注意.そうですよね。。ならどんな単位で測ると良いんでしょうね。
そういえば、「Lisp は S/N 比が高いので・・・」どうのこうの、というようなことを良く見聞きしますが、S/N 比ってなんなんでしょう?
ノイズが少ないってことなんですかね。
On Lisp の後注がおもしろいですね。Yコンビネータが出てきたり、SICP(計算機プログラムの構造と解釈)が出てきたりします。Paul Graham は自分のやってる VC の名前を「Y Combinator」にしたり、SICP の原書にレビューしてたりと、きっと両方共好きなんでしょうね。SICP 原書のレビューの方には、最近話題(と、言っても原書は20年前のものらしい)の実用 Common Lisp (IT Architects’Archive CLASSIC MODER) の著者 Peter Norvig 氏もレビューしてますね。
On Lisp の後注がおもしろいですね。Yコンビネータが出てきたり、SICP(計算機プログラムの構造と解釈)が出てきたりします。Paul Graham は自分のやってる VC の名前を「Y Combinator」にしたり、SICP の原書にレビューしてたりと、きっと両方共好きなんでしょうね。SICP 原書のレビューの方には、最近話題(と、言っても原書は20年前のものらしい)の実用 Common Lisp (IT Architects’Archive CLASSIC MODER) の著者 Peter Norvig 氏もレビューしてますね。
2010/06/16
On Lisp 非決定性
On Lisp の非決定性の章がとてもわかりやすいです。以前写経した、syntax-rules 版の amb より、関数版の方がよくわかりました。
以下のコードは関数版の方です。取りあえず動かしてみました。
で、少し書き換えてみました。(Gauche)
その後、自分でも思いついたサンプルを書こうとしたのですが、思ったように動きません。。わかったようでわかっていないようです・・・。
以下のコードは関数版の方です。取りあえず動かしてみました。
で、少し書き換えてみました。(Gauche)
その後、自分でも思いついたサンプルを書こうとしたのですが、思ったように動きません。。わかったようでわかっていないようです・・・。
2010/06/09
if-let1 の所在
On Lisp のアナフォリックマクロで aif というものがあります。scheme で書いてみたりしました。
Gauche には if-let1 があるということを教えて頂きました。
これですね。
で、grep してみたら lib/gauche/common-macros.scm の中にありました。このファイルはおもしろそうですね。。
;like aif in On Lisp, but explicit varif-let1 なるほど、この名前しっくり。
ググってみると。
2010/06/06
anaphora
2010/05/31
2010/05/18
On Lisp からいくつか
読んでいて「おっ」と思ったところを、メモっておいても良いですか?
関数定義内にあるマクロ呼び出しは関数がコンパイルされるときに展開形に置換される. マクロを呼び出す関数がコンパイルされた後にそのマクロを再定義したらどうなるだろうか? 元々のマクロ呼び出しの形跡は残っていないので,関数内の展開形は更新されない.
applyやfuncallの第1引数としては渡せないし, 呼出側の関数が新たなローカルな束縛を生むような環境では使うべきでない.
マクロ呼び出しは,書かれた所に直接展開される.
マクロはマクロ呼び出し内の引数の評価を制御する. 評価回数は引数がマクロの展開コードのどこに置かれるかによるが, 1回でも複数回でも良いし,全く評価しないこともある.
Lispプログラムでのマクロ展開は全てプログラムがコンパイルされたときに行われ, コンパイル時に実行できるどのような計算も,実行時にプログラムを遅くすることはない.
関数は(例えばapplyに)引数として渡すことも,関数から返すことも, データ構造内に格納することもできる. マクロではそれらはどれも不可能だ. これらはマクロ呼び出しをλ式で包むことで実現できる場合がある.
言われてみれば、そりゃそうだ、というものが多い気もしますが、なるほどです。
LET OVER LAMBDA Edition 1.0 もおもしろいけど、On Lisp はもっとおもしろい。LET OVER LAMBDA Edition 1.0 の著者が以下のように言うのもわかる気がする。
マクロに興味を持つ者なら誰もが、On Lisp の一言一句を逃さず読まなければならない。
こんなに引用ばかりで良いのかな。でもメモっておきたかったので。
2010/05/13
メモ化された Y Combinator
メモ化は The Seasoned Schemer にも出てきますね。Y Combinator は昨日のコレを改造しました。
すげー。これカッチョイイな!!memoized-Y 。
こちらを参考にしました。こんな使い方があったとは・・・。
私も以前 JS で Y してるコードがありましたので、うp。
ほんと、「マクロのない Sceme」といったノリだなーなどと。
すげー。これカッチョイイな!!memoized-Y 。
こちらを参考にしました。こんな使い方があったとは・・・。
私も以前 JS で Y してるコードがありましたので、うp。
ほんと、「マクロのない Sceme」といったノリだなーなどと。
追記
少し修正したので。
labels :
Gauche,
onlisp,
scheme,
Y Combinator
登録:
投稿 (Atom)