トップ «前の日記(2008-04-07) 最新 次の日記(2008-04-10)» 編集

Route 477



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

[これはあたらしい]

技術者の家族どうしでピクニックだそうです。いいなぁ。

本日のツッコミ(全2件) [ツッコミを入れる]
takkanm (2008-04-10 23:15)

>ここで再帰ですよ。これがLisp脳か!<br>同じことをCで書いて、サクッとスタックをとばした俺がやってきましたよ

yhara (2008-04-15 17:48)

そうか、末尾再帰が最適化されるかを考えれば、「Lisp脳」ではなく「Scheme脳」と言うのが正確ですね。