2007-01-01から1年間の記事一覧

Collatz (角谷) の予想と有酸素運動マン

コラッツの問題という、数論上の未解決の問題があります。任意の自然数について、偶数ならば 2 で割り、奇数なら 3 倍して 1 を加える、という操作を繰り返すと 1 に収束する (無限大に発散しない)、という主張です。ストリームで表すと、このようになります…

継続渡しによる停止・再開可能な反復処理

ここ最近の Scheme プログラミングで得た感覚を踏まえ、各種 JavaScript ライブラリでお馴染みの $ 関数 (ID による要素検索) を、ごく簡易にですが、関数スタイルで実装してみました。まずは実装を見ていただく前に、このような例を考えてみてください。 $(…

無限数列、無限級数、円周率

SICP ネタです。SICP 3章のストリームの節に、ライプニッツ級数というものが紹介されています。 pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...という式です。項毎に符号が入れ替わる奇数の逆数の無限列、その総和が、パイの4分の1に収束する、というものです。一見理…

Scheme で livedoor Reader を

読めるようになりました。 http://json.org/ にリンクがありますが、MzScheme 用 JSON ライブラリを使っています。使い方は簡単で、json-read という関数に JSON データの入力ポートを渡すだけです。抜粋: (define (api-post api post-data) (let ((in (post…

Meadow + Anything で音楽CDを操作

Meadow に組み込みの mw32-mci-send-string 関数を使って CD ドライブを操作する anything ソースを考えてみました。 (defvar anything-c-source-cdplayer '((name . "CDPlayer") (candidates . ("play" "stop" "eject")) (action ("Do" . (lambda (cmd) (co…

anything で 2ch のスレッドを開く

遅ればせながら、話題の anything.el を使い始めました。噂に違わぬ凄さです。感覚的には Mac OS X の右上のやつ (spotlight) みたいな感じで、Emacs が飛躍的に便利になります。話は変わりますが、少し前にちょっと思い付いて 2ch の活動状況を監視するプロ…

Emacs クイズ

日記を書く[・ _ゝ・]はやみずさん - Emacs クイズ よりパッと閃いた一問だけ答えさせてください。 q5. "hello"という文字列が名前に含まれるコマンドの一覧を取得する方法は? 普通は M-x apropos-command で調べるのが良いと思うんですが、個人的にはこう…

podcast の新着を Winamp に追加する

最初に (Common) Lisp 入門として Scheme を学んだ頃には想像すらしなかった事態なんですが、今や Scheme でプログラムを書くのが私にとってすごく自然で楽しい行為になってきています。元は Lisp ぎらいだったんですが、嫌いな食べ物が突然食べられるように…

確率モナド

Generic Monad System の利用例として、まずはリスト・モナドの典型的な使用方法を概観します。後半で、リスト・モナドと別のモナドを合成するモナド・トランスフォーマーの実例を示したいと思います。 リスト・モナド 話を分かりやすく (?) するために、以…

Generic Monad System in Scheme

id:reinyannyan:20070714:p1 で考案したモナド実装案がほぼ実用的になってきましたので、取りあえず公開します。monad.tar.gz (PLT Scheme 用)monad.ss という、インターフェースとなるモジュールがあり、それを maybe.ss や list.ss 等の具象モジュールが実…

パラメータを用いたポリモーフィズムの実験

モナド的な何かに向かって において、「false かそれ以外か」という二元論のみに基づいた (つまり、Haskell のように特殊なコンテナを用いない) Maybe モナドの実現可能性について考察しました (実装)。一応それはうまくいったように思うんですが、今度は、…

Maybe monad module in Scheme

Updated: 20070714monad.ss: ;; This module provides a set of Haskell's Maybe monad-like ;; computation constructs, all of which are implemented without ;; introducing additional containers as Haskell does. ;; ;; This is due to the observati…

モナド的な何かに向かって

Scheme でプログラムを書いていると (Scheme に限らずなんですが)、このようなパターンが繰り返し出てくることに気付きます: (let ((the-value (func-which-returns-useful-value-or-#f))) (if the-value (do-something-based-on the-value))) ある処理の結…

Emacs - Scheme 間通信 ~ S 式オブジェクト記法による ~

最近 MP3 のタグを読むプログラムが必要になり、elisp で書こうとしました。が、バイナリ・データの扱いが無理っぽい気がしたので、Scheme で書くことにしました。一応それは上手くいったんですが、アプリケーション自体は emacs 上に作りたかったため、Sche…

関数生成関数の利用例: ミニバッファ履歴の整理

id:reinyannyan:20070416:p1 (簡易クロージャの実装) で、変数の値を関数式の中にインライン展開することで擬似クロージャを作成する方法を考えました*1。今回はその応用編です。savehist-mode を有効にして、ミニバッファの入力履歴を Emacs セッションを通…

ワイルドカードを含むディレクトリをブックマーク登録

dired (ディレクトリ一覧モード) でワイルドカードが使えるのをご存知でしょうか? C-x d でディレクトリを開く際にワイルドカードを使うと、そのバターンにマッチするファイルだけを一覧することができます。ファイルが乱雑に置かれているような作業ディレ…

ミニバッファ上でワイルドカード展開

Vim から Emacs に移行して (併用はしてますが) 困ったことの一つが、ファイルを開く時 (C-x C-f) にグロブ記号を展開してくれない、ということでした。厳密には、内部的にはグロブ文字を受け取ってはくれるんです。が、マッチした全てのファイルを開いてし…

ファイル保存時に余計な空行を削除する

コードの折り畳み機能を使うようになって気付いたんですが、折り畳みの前後に空行を開いてコードを書き足していると、知らないうちに無駄な連続空行を作ってしまうことがあります。それを自動的に解消する方法を考えてみました。2 行以上の連続空行を保存時…

リストとしての関数 -> 簡易クロージャの実装

最近 Lisp がお気に入りです。今日は、Lisp プログラムがリスト (括弧で括られた式) として表記される、という当たり前の事実について、Emacs Lisp をベースにしながら考察してみたいと思います。 関数はリスト、リストは関数 古い Lisp では、関数は第一要…

折り畳み表示

emacs を使いだして困ったことの一つが、ファイルを折り畳み表示する (一覧性を高める) 方法がなかなか分からなかったことです。Vim ではインデント単位で折り畳む設定が便利なんですが (set fdm=indent)、emacs ではどうするのか、調べることすらままならな…

ランダムな関数実行

Mochikit を使って、複数の関数をランダムに呼ぶ関数、というのを作ってみました。 function randcall(/*f1, f2, f3...*/) { var f = partial(compose(next, irand), arguments); return function() { return f().apply(this, arguments); }; }短い中に Moch…

更新: LDR フィード絞込みスクリプト - ランダム・フィルター

id:reinyannyan:20070223:p1 のアップデートです。新オプションとして、":random" を追加しました (省略形は ":rnd")。フィードを無作為にふるい落とし、表示数の設定に関わらず、フィード一覧の読み込みを軽くする効果があります。使用例として、次のような…

気まぐれな配列 push

データを配列に追加する時に、わざと「漏れ」を生じさせる、ということを考えてみました。 function push_or_not(ary, v) { (Math.random() <= 0.5) && ary.push(v); }およそ半分の確率で漏れます。さらに漏れ具合をランダムにしてみましょう: function push…

配列の AND、非同期な AND 検索

配列の積集合・和集合 ちょっと用があって、複数の配列の共通要素を取り出す関数を作ってみました。Mochikit を使っています。 function intersection() { var len = arguments.length; var tmp = {}; return filter( function(x) { tmp[x] || (tmp[x] = 0);…

微修正: LDR フィード一覧絞込みスクリプト、ほか

LDR でフィード一覧をフラット表示にしてみて、絞り込みを行った際にソーティングがされないことに気付きました。この点の修正を行いました: ldr_subs_filter.user.js あと、LDC からタグ・クラウド生成デモに微妙な不具合がありました。deferredSequence と…

更新: LDR フィード一覧絞込みスクリプト - フィルタ固定機能

id:reinyannyan:20070223:p1 のアップデートです。コマンド :persist を追加しました。フィルタ設定時に :persist を指定すると、それ以降 "r" キーでの再読み込み時に同じフィルタが自動的に適用されるようになります。使用例: :! #{ rate >= 4 } :p:reload…

アップデート: LDR フィード絞込みスクリプト

(id:reinyannyan:20061013:p1 のスクリプトのアップデートです。概要・使用方法についてはそちらをご参照ください。)コロン・コマンド ":reload" を新たに追加しました。これまでは、フィード一覧を全部読み込んでから絞り込みを行う必要があったんですが、…

はじめての elisp (LDR の未読件数を表示)

emacs はじめました。Lisp への関心、と言うより憧れの感情から Scheme を学び始め、Vim+Scheme の組み合わせが案外扱いづらいな、という感想から emacs に手を出したところ、後戻りできなくなってしまった、という感じです。元来私はガチガチの Vimmer だっ…

引数固定、関数合成

id:reinyannyan:20070110:p1 の Scheme 風関数群を用いて、"cut" と "compose" という、関数操作のための便利な関数を実装します。また、その応用例として、関数的な DOM 操作の手法についても見ていきたいと思います。 引数固定 Scheme の拡張仕様として "c…

Scheme 的多値の実装

擬似的なものですが、Scheme の多値の受け渡しの仕組みを実装してみました。このようなものです: call_with_values( function(){ values(1, 2, 3) }, function(a, b, c){ // a == 1, b == 2, c == 3 } );call_with_values の第一引数は多値を返す関数で、第…