2007-01-01から1年間の記事一覧
コラッツの問題という、数論上の未解決の問題があります。任意の自然数について、偶数ならば 2 で割り、奇数なら 3 倍して 1 を加える、という操作を繰り返すと 1 に収束する (無限大に発散しない)、という主張です。ストリームで表すと、このようになります…
ここ最近の Scheme プログラミングで得た感覚を踏まえ、各種 JavaScript ライブラリでお馴染みの $ 関数 (ID による要素検索) を、ごく簡易にですが、関数スタイルで実装してみました。まずは実装を見ていただく前に、このような例を考えてみてください。 $(…
SICP ネタです。SICP 3章のストリームの節に、ライプニッツ級数というものが紹介されています。 pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...という式です。項毎に符号が入れ替わる奇数の逆数の無限列、その総和が、パイの4分の1に収束する、というものです。一見理…
読めるようになりました。 http://json.org/ にリンクがありますが、MzScheme 用 JSON ライブラリを使っています。使い方は簡単で、json-read という関数に JSON データの入力ポートを渡すだけです。抜粋: (define (api-post api post-data) (let ((in (post…
Meadow に組み込みの mw32-mci-send-string 関数を使って CD ドライブを操作する anything ソースを考えてみました。 (defvar anything-c-source-cdplayer '((name . "CDPlayer") (candidates . ("play" "stop" "eject")) (action ("Do" . (lambda (cmd) (co…
遅ればせながら、話題の anything.el を使い始めました。噂に違わぬ凄さです。感覚的には Mac OS X の右上のやつ (spotlight) みたいな感じで、Emacs が飛躍的に便利になります。話は変わりますが、少し前にちょっと思い付いて 2ch の活動状況を監視するプロ…
日記を書く[・ _ゝ・]はやみずさん - Emacs クイズ よりパッと閃いた一問だけ答えさせてください。 q5. "hello"という文字列が名前に含まれるコマンドの一覧を取得する方法は? 普通は M-x apropos-command で調べるのが良いと思うんですが、個人的にはこう…
最初に (Common) Lisp 入門として Scheme を学んだ頃には想像すらしなかった事態なんですが、今や Scheme でプログラムを書くのが私にとってすごく自然で楽しい行為になってきています。元は Lisp ぎらいだったんですが、嫌いな食べ物が突然食べられるように…
Generic Monad System の利用例として、まずはリスト・モナドの典型的な使用方法を概観します。後半で、リスト・モナドと別のモナドを合成するモナド・トランスフォーマーの実例を示したいと思います。 リスト・モナド 話を分かりやすく (?) するために、以…
id:reinyannyan:20070714:p1 で考案したモナド実装案がほぼ実用的になってきましたので、取りあえず公開します。monad.tar.gz (PLT Scheme 用)monad.ss という、インターフェースとなるモジュールがあり、それを maybe.ss や list.ss 等の具象モジュールが実…
モナド的な何かに向かって において、「false かそれ以外か」という二元論のみに基づいた (つまり、Haskell のように特殊なコンテナを用いない) Maybe モナドの実現可能性について考察しました (実装)。一応それはうまくいったように思うんですが、今度は、…
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))) ある処理の結…
最近 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…
id:reinyannyan:20070223:p1 のアップデートです。新オプションとして、":random" を追加しました (省略形は ":rnd")。フィードを無作為にふるい落とし、表示数の設定に関わらず、フィード一覧の読み込みを軽くする効果があります。使用例として、次のような…
データを配列に追加する時に、わざと「漏れ」を生じさせる、ということを考えてみました。 function push_or_not(ary, v) { (Math.random() <= 0.5) && ary.push(v); }およそ半分の確率で漏れます。さらに漏れ具合をランダムにしてみましょう: function push…
配列の積集合・和集合 ちょっと用があって、複数の配列の共通要素を取り出す関数を作ってみました。Mochikit を使っています。 function intersection() { var len = arguments.length; var tmp = {}; return filter( function(x) { tmp[x] || (tmp[x] = 0);…
LDR でフィード一覧をフラット表示にしてみて、絞り込みを行った際にソーティングがされないことに気付きました。この点の修正を行いました: ldr_subs_filter.user.js あと、LDC からタグ・クラウド生成デモに微妙な不具合がありました。deferredSequence と…
id:reinyannyan:20070223:p1 のアップデートです。コマンド :persist を追加しました。フィルタ設定時に :persist を指定すると、それ以降 "r" キーでの再読み込み時に同じフィルタが自動的に適用されるようになります。使用例: :! #{ rate >= 4 } :p:reload…
(id:reinyannyan:20061013:p1 のスクリプトのアップデートです。概要・使用方法についてはそちらをご参照ください。)コロン・コマンド ":reload" を新たに追加しました。これまでは、フィード一覧を全部読み込んでから絞り込みを行う必要があったんですが、…
emacs はじめました。Lisp への関心、と言うより憧れの感情から Scheme を学び始め、Vim+Scheme の組み合わせが案外扱いづらいな、という感想から emacs に手を出したところ、後戻りできなくなってしまった、という感じです。元来私はガチガチの Vimmer だっ…
id:reinyannyan:20070110:p1 の Scheme 風関数群を用いて、"cut" と "compose" という、関数操作のための便利な関数を実装します。また、その応用例として、関数的な DOM 操作の手法についても見ていきたいと思います。 引数固定 Scheme の拡張仕様として "c…
擬似的なものですが、Scheme の多値の受け渡しの仕組みを実装してみました。このようなものです: call_with_values( function(){ values(1, 2, 3) }, function(a, b, c){ // a == 1, b == 2, c == 3 } );call_with_values の第一引数は多値を返す関数で、第…