タグ

ブックマーク / reinyannyan.hatenadiary.org (5)

  • リスト内包表記の活用 - 数独ソルバー - (new Hatena).blog()

    Peter Norvig 氏の Solving Every Sudoku Puzzle というエッセイで、数独の解き方が Python を使って示されています。 ちょうど SRFI-42 (eager comprehension) というライブラリを使ってみたいなと思っていたところに見つけたので、ジェネレータ式というものが多用されているこの Python コードは恰好の題材でした。 ということで、原文の流れに沿いながら Scheme に訳していきたいと思います。 まず用語を紹介しておきます。 9x9マスの縦の列を column、横の列(行)を row と言うのは自明と思いますが、3x3 のまとまりは block、そして各マスを square と呼んでいます。 さらに、row、column、block それぞれ9マスずつのまとまりを unit、1つの square が所属する unit 内の

    リスト内包表記の活用 - 数独ソルバー - (new Hatena).blog()
    agw
    agw 2008/12/11
  • 継続渡しによる停止・再開可能な反復処理 - JavaScriptライブラリでお馴染みの$関数を関数スタイルで実装してみる

    ここ最近の Scheme プログラミングで得た感覚を踏まえ、各種 JavaScript ライブラリでお馴染みの $ 関数 (ID による要素検索) を、ごく簡易にですが、関数スタイルで実装してみました。 まずは実装を見ていただく前に、このような例を考えてみてください。 $("id").do_something(); ここで、"id" 要素が確実に見つかるかどうかが保証されていない (do_something が失敗するかもしれない) とします。すると、 var o = $("id"); if (o) { o.do_something(); } のように、いちいちテストをしなければいけませんよね。 これが、関数スタイルでは $("id", do_something); と書くだけで済みます。つまり、$ 関数自身が成否のチェックを行い、成功していればコールバック関数にオブジェクトを渡すように設

    継続渡しによる停止・再開可能な反復処理 - JavaScriptライブラリでお馴染みの$関数を関数スタイルで実装してみる
  • Scheme 的多値の実装 - (new Hatena).blog()

    擬似的なものですが、Scheme の多値の受け渡しの仕組みを実装してみました。このようなものです: call_with_values( function(){ values(1, 2, 3) }, function(a, b, c){ // a == 1, b == 2, c == 3 } );call_with_values の第一引数は多値を返す関数で、第二引数はそれを受け取る関数です。 多値と言っても JavaScript ですのでただの配列なんですが、それを関数に渡す際にばらしてやることで、擬似的に多値を実現することが出来るわけです。 実装はこんな感じです: function values() { return list_tail(arguments, 0); // Or, return Array.prototype.slice.call(arguments); } functi

    Scheme 的多値の実装 - (new Hatena).blog()
  • リストとしての関数 -> 簡易クロージャの実装 - (new Hatena).blog()

    最近 Lisp がお気に入りです。 今日は、Lisp プログラムがリスト (括弧で括られた式) として表記される、という当たり前の事実について、Emacs Lisp をベースにしながら考察してみたいと思います。 関数はリスト、リストは関数 古い Lisp では、関数は第一要素に "lambda" というシンボルを持つ、というだけの単なるリストであったそうです。 新しい Lisp (Scheme や Common Lisp) では「関数」という独立した型になっていますが、Emacs Lisp では今も古い時代の性質を残しているということで、この点を Common Lisp と対比しながら検証してみます。 lambda 式 (関数) を、そのままの形と、二通りのクォート式で括った形、それぞれについてテストします (Meadow 3.00 と GNU CLISP 2.41 を使用しています)。

    リストとしての関数 -> 簡易クロージャの実装 - (new Hatena).blog()
  • 折り畳み表示 - (new Hatena).blog()

    emacs を使いだして困ったことの一つが、ファイルを折り畳み表示する (一覧性を高める) 方法がなかなか分からなかったことです。 Vim ではインデント単位で折り畳む設定が便利なんですが (set fdm=indent)、emacs ではどうするのか、調べることすらままならない状態でした。 ようやく "Outline minor mode" というものが使えることが分かり (折り畳み = folding という用語では見つからないわけです)、さらに以下の補助関数が出来上がりました: (defun outline-hide-body (&rest rxs) (outline-minor-mode t) (and rxs (set (make-local-variable 'outline-regexp) (join-list rxs "\\|"))) (hide-body)) (defun

    折り畳み表示 - (new Hatena).blog()
    agw
    agw 2007/04/23
    mapconcat
  • 1