遅延評価については、Gauche には util.stream というのがあるようです。馴染みがないです。
2010/06/30
fib, tail-call-fib, lazy-fib
一般的な fib, 末尾再帰 fib, 遅延評価 fib ということで。(なんか途中に nlet が紛れ込んでますが)
遅延評価については、Gauche には util.stream というのがあるようです。馴染みがないです。

遅延評価については、Gauche には util.stream というのがあるようです。馴染みがないです。
2010/06/29
syntax-rules: ext-let
CL とか Clojure の destructuring-bind があればそれで済みそうですが、Gauche にはどうやらなさげ?
syntax-rules だとこんな感じでしょうか。。
これだと、(ext-let (a b)(1)(print a)) などでも動きます。(var ...) と (val ...) が同じ長さでない場合エラーにしたいって時はどうしたら良いのでしょうか。
syntax-rules だとこんな感じでしょうか。。
これだと、(ext-let (a b)(1)(print a)) などでも動きます。(var ...) と (val ...) が同じ長さでない場合エラーにしたいって時はどうしたら良いのでしょうか。
追記
なんとなく希望に近い動きしてるように見えますが・・・。うーん・・・頭痛くなりますね。補助マクロとして切り出せば少しはマシに見えるのかもしれませんね。追記2
こんな感じ?ヘルパー。
labels :
Gauche,
scheme,
syntax-rules
Re: Clojure カッコイイ!
そういえば先日、@shunsuk さんから「Clojure を使うメリットって何?」と聞かれました。困りました。
- S式で Java が書ける
- Java の経験があって Lisp が好きな人はうれしい
この二つしか思い浮かびませんでした・・・。結局、両方とも同じ意味ですよね。。個人的にはこれくらいしかメリットが思い浮かびませんでした。Clojure の特徴はいろいろあると思うのですが、「Clojure でないと困る」とか「こういう時は Clojure が最適!」っていうケースがあるのか正直わかりませんし知りません。
私自身も、これから Clojure をメインで使いたいとか、プログラミングClojure を読み終えてからさらに勉強してみたいとも思えませんし・・・。
プログラミングClojure を読み終わったらもう一度考えてみたいと思います。っていうか、教えてエロい人!
私自身も、これから Clojure をメインで使いたいとか、プログラミングClojure を読み終えてからさらに勉強してみたいとも思えませんし・・・。
プログラミングClojure を読み終わったらもう一度考えてみたいと思います。っていうか、教えてエロい人!
追記
やっぱり、JVM で走って Java と仲の良い Lisp だからってことで FA?
labels :
clojure
Clojure カッコイイ!
おもしろいページがあったのでメモ。
以下余談
遅ればせながら、プログラミングClojure を読んでいます。頂いてから随分経ってしまいました。。Clojure カッコイイですねぇ。おもしろいです。
今5章まで読んだところですが、5章(関数型プログラミング)とてもおもしろいです。
ここまでで良いなーと思った点は
ここまでで良いなーと思った点は
- 関数定義のコメント
- doc 関数
- 同名の関数で引数の数ごとに処理を記述できる(オーバーロードとか syntax-rules っぽいなーなどと)
- 型ヒント
- なんでもシーケンス
- なんでも遅延シーケンス
- Java の呼び出しが自然 (「S式で書ける Java」といった印象)
そういえば、多値とか継続はないっぽい?
やっぱり気になる。。といった点は
- 引数ベクタで[]しか使えない
- cond や let の括弧が少ない
両方とも好みの問題だと思います。1 は見る分には慣れてきました。書く時はやはり()で書けた方が好きです。2 は相変わらず見づらいです。でも両方とも大して気になりません。
書評
2010/06/24
syntax-rules: across (Clojure の .. ぽいもの)
プログラミングClojure P.62~ 「Clojure から Java を使う」より。
Java だと
scheme (gauche) の syntax-rules で書くと下記のような感じでしょうか。
良い名前が思いつきませんでした。当初は chain にしてましたが、なんとなく across に変えました。。
書いてみたコードは以下のようなもの。

(.getLocation (.getCodeSource (.getProtectionDomain (.getClass '(1 2)))))が
(.. '(1 2) getClass getProtectionDomain getCodeSource getLocation)と書けますよーということのようです。
Java だと
'(1 2).getClass().getProtectionDomain().getCodeSourse().getLocation();みたいなイメージで良いんでしょうかね。
scheme (gauche) の syntax-rules で書くと下記のような感じでしょうか。
良い名前が思いつきませんでした。当初は chain にしてましたが、なんとなく across に変えました。。
書いてみたコードは以下のようなもの。
追記
本家ソースはこれかな。
labels :
clojure,
Gauche,
scheme,
syntax-rules
2010/06/20
なんで Lisp/Scheme の変数名は長いの?
そういえば。さっきの記事を書き終わって思い出しました。shiro さんがこんなことを仰っていた。
ところで Clojure の meta ってなんだろ。プログラミングClojure P.54 の「メタデータ」のところのことかな。せっかく頂いたのにまだ読んでいない・・・。

Lisp/Schemeの変数名が長くなりがちなのは、変数名にしか読者への情報を乗せられないということもあるな。静的型なら型名に情報を乗せて、変数名自体は一文字でもけっこういける。なるほどー。
だが型情報だけが乗せたい情報というわけでもない。とすれば一般的にメタ情報を乗せる仕組みをつくればいいか?
Clojureのmetaはそういう仕組みではあるな。
ところで Clojure の meta ってなんだろ。プログラミングClojure P.54 の「メタデータ」のところのことかな。せっかく頂いたのにまだ読んでいない・・・。
追記
長いシンボルを補完できるエディタがあったからだと思います RT @valvallow: なんで Lisp/Scheme の変数名は長いの? http://ff.im/-moAHF
@wasabiz それもあるけど、組み込み関数の命名とかさ。Common Lispは「クソ長い」の。AT&TのC文化圏では「命名は短く」ってのがあって、それはテキストエディタで打つとメンドくせえし間違えるから。CLは関数名を「自動補完で記述する」前提があるんですよ。
追記
- vallog: Gauche: use してる module から export されてる symbol たち
- vallog: 初期状態で見えているsymbolたち(Gaucheのuserモジュール)
- vallog: Gaucheのmoduleとdefine-in-moduleとevalで作るsandbox
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 氏もレビューしてますね。
登録:
投稿 (Atom)