2008-04-09
■ [scheme] 再帰の美しい使い方
Webアプリなどで予測されにくいユニークなIDを作るとき、 「適当な乱数からIDを作って、万一被っていたら再試行する」という コードを書きますよね。
で、C言語とかだと for(;;){ } とか、do{ }while(); を使うんだけど、 Gauche本に乗っていた方法がこちら。
(define (make-session) (let1 sid (random-integer *max-id*) (cond [(hash-table-get *sessions* sid #f) (make-session)] ; 被ってたら、再試行する [else (let1 sess (make <session> :sid sid) ; さもなくば (hash-table-put! *sessions* sid sess) sess)])))
ここで再帰ですよ。これがLisp脳か!
■ [scheme] SRFIのボツになったやつを眺めるのが面白い
http://srfi.schemers.org/ では、Schemeのライブラリの統一規格である SRFI (サーフィと読むらしい) の仕様が公開されています。
特に有名なのはリストを扱うライブラリsrfi-1 や文字列を扱うライブラリsrfi-13 ですが、 そういう規格として成立したものだけでなく、 ボツになったライブラリも http://srfi.schemers.org/withdrawn-srfis.html で公開されているので、一度眺めてみると面白いんじゃないでしょうか。
タイトルを適当に日本語訳してみたのがこちら。 タイトルだけ見るとすごく面白そうなのもあるんですけどねぇ。
- SRFI 3: リストを集合として扱うライブラリ
- SRFI 12: 例外処理
- SRFI 15: 動的スコープのための文法
- SRFI 20: シンプルなオブジェクトシステム
- SRFI 24: ローカルなレキシカルスコープにおけるdefine-syntax
- SRFI 32: ソートライブラリ
- SRFI 33: 整数のビット演算
- SRFI 50: SchemeとC言語の混合
- SRFI 52: 拡張文字セット
- SRFI 53: computation-rulesで構文を計算する(?)
- SRFI 56: バイナリI/O
- SRFI 65: define-immutable: 変更不可能な値を宣言するための構文
- SRFI 68: 包括的なI/O
- SRFI 73: 正確な無限数
- SRFI 75: R6RS ユニコード
- SRFI 76: R6RS レコード型
- SRFI 77: Preliminary Proposal for R6RS Arithmetic
- SRFI 79: プリミティブなI/O
- SRFI 80: ストリームI/O
- SRFI 81: ポートI/O
- SRFI 82: ストリームポート
- SRFI 83: R6RS ライブラリ構文
- SRFI 84: 世界中で一つしかないID
- SRFI 85: 再帰的に等価性を判定する述語
- SRFI 91: 拡張ポート
- SRFI 92: ALAMBDAとALAMBDA*
- SRFI 93: R6RS syntax-case
「R6RS」と付いているものは、言語使用の議論のために便宜的にSRFIの形を 取っていたもののようです。
■ [event] 技術者の家族同士で交流を深めてみようやん第1回(仮)
via http://ujihisa.nowa.jp/entry/e106ef25fe
[これはあたらしい]
技術者の家族どうしでピクニックだそうです。いいなぁ。
>ここで再帰ですよ。これがLisp脳か!<br>同じことをCで書いて、サクッとスタックをとばした俺がやってきましたよ
そうか、末尾再帰が最適化されるかを考えれば、「Lisp脳」ではなく「Scheme脳」と言うのが正確ですね。