2008-02-01から1ヶ月間の記事一覧

Parsec

本格的に Parsec でプログラムを組んでみて、ようやく使い方が習得できました。言語自体に親和性が高いパーサーは、素晴らしいですね。ところで「ふつうの Haskell プログラミング」に付いてる LazyLines ですが、文法の説明に 「*」を連続して書くとネスト…

Electric な Ruby の end (3)

Electric な Ruby の end (2)で気付いたことを直しただけで、公開していませんでしたが、これが現在のバージョンです。コメントが付いたので、思い出しました。(_ _) (defvar ruby-elect-keyword '("def" "if" "class" "module" "unless" "case" "while" "do…

haskell-mode

Emacs の haskell-mode は、インデントが変で使う気になれませんでしたが、Haskell mode の indent cycleを読んで、クルクル回せることが分りました。(Mew みたいだ。:)でも僕の好みの位置は、大抵 2 番目です。ソースをぱっと見たところ、カスタマイズでき…

モナド則

3つのモナド則の内、ようやく2つが理解できました。 (return x) >>= f == f x 以下のような DB を考えます。 db = [("alice", [("title", "Ms."), ("city", "Yokohama")]), ("bob", [("title", "Mr."), ("city", "Sapporo" )])] "alice" の "city" が調べた…

load-path などの設定

ruby-modeの話で、append ではなく cons を使うべきだと書いたところ、使い方に悩んでいる人がいるようです。たとえば、cons で2 つパスを追加しようとすると、 (setq load-path (cons "foo" (cons "bar" load-path))) となって見にくいです。append なら、 …

alpaca v0.13 のリリース

自称「世界一の alpaca ユーザ」さんから、「alpaca にはバグがある」という話を常々されていたのですが、この程「再現できた」という報告を受け、そのバグを取りました。バグの内容は以下の通り: C-xC-s で保存していない GnuPG ファイルをバッファメニュ…

はじめての Haskell

昨日、友達にこんなことを話しました。 Haskell でプログラミングするときは、とりあえず効率のことは忘れる。 メモリーは無限にあると考え、コンパイラーと遅延評価が頑張ってくれると信じる。 Haskell では what を記述する。 効率を考えている時点で、how…

IO モナド

今日も懲りずにモナドの話です。Haskell/Understanding monadsを読んだ覚え書き。以下の echo で、bind が何をしているか読み解きます。 echo = getChar >>= putChar この echo は実際動きます。一方、これ以降のコードは動きません。Haskell 風に書いている…

Haskell とモナド (2)

Haskel とモナドに対するコメントについて、以下を読むとよいみたいです。 DanoMoi と Haskell HaskellのモナドIO HaskellのモナドIO(つづき) ">>=" も ">>" も、糊なのかな?

写真では何を表現したいかが大事

知り合いにカメラを撮るときのポイントについて聞かれましたので、折角なのでまとめてみました。 写真では何を表現したいかが大事

Haskell とモナド

今日までに理解した Haskell とモナドについて、まとめてみます。間違っているところもあると思いますので、コメントを期待しています。(_ _) Haskell の特徴 純粋関数型言語です。 参照透過性 変数は初期化できますが、一旦決まった値は変更できません。関…

Emacs Lisp のダメなところ

Emacs Lisp をこよなく愛する僕の目から、Emacs Lisp がダメだと思うところをまとめておきます。 文化的な問題 Emacs Lisper の多くは、Lisp が好きで使っているのではなく、Emacs が好きだからしかたなく使っているのでしょう。本当は C で書きたいのに、無…

Scheme でλ計算(2)

昨日の続き。今日はチャーチ数です。 ZERO と ONE ZERO と ONE の定義は簡単です。 ;; 0 := λf x. x (define ZERO (lambda (f x) x)) ;; 1 := λf x. f x (define ONE (lambda (f x) (f x))) SUCC SUCC の定義も、昨日の CONS が分れば、同じようにできます。…

Scheme でλ計算

Wikipedia のラムダ計算にある例を Scheme で実行して理解してみます。 TRUE と FALSE TRUE と FALSE は簡単です。 ;; TRUE := λx y. x (define TRUE (lambda (x y) x)) ;; FALSE := λx y. y (define FALSE (lambda (x y) y)) AND、OR、NOT 難しいのは、本体…

my-defstruct

Emacs で (require 'cl) とすると defstruct が使えるようになります。ちょっと調べてみました。 大きなマクロで理解するのは困難 Common Lisp の defstruct なので、getter はあるが、setter がない という訳で、自分で実装してみました。 (defun my-keywor…

Electric な Ruby の end (2)

Electric な Ruby の endですが、ブックマークのコメントにバグが指摘してあったので、直してみました。バグの報告は、ブログのコメントに書き込んで頂けると嬉しいです。(_ _) (defvar ruby-elct-regex "def\\|if\\|class\\|module\\|unless\\|case\\|while…

Arc のハッシュ

川合さんのエッセイ「Schemer's way」は面白く、とてもためになります。ただ一点、フェアな議論なのか気になるところがありました。 多くの言語では、新しいオペレータを追加するのは言語そのものを拡張しなければならないだろう。例えばJavaを拡張してPerl…

Electric な Ruby モードの end

Ruby に付いてくる ruby-electric.el では、たとえば class と打った後に空白を入れると end が挿入されます。僕が欲しいエレクトリックな機能は、これじゃありません。end と押すと対応する単語に飛んでほしいのです。というわけで作ってみました。別ファイ…

ruby-mode

Ruby には Emacs の ruby-mode.el が付随しています。README などに設定方法が書いてないので、ほとんどの人は、検索して設定例を探すでしょう。すると、こんな不効率な設定方法が見つかります。 (autoload 'ruby-mode "ruby-mode" "Mode for editing ruby s…

cdr の decrement

Lisp の car や cdr が、以下の略であることぐらい、Lisp をかじったことのある人なら知っているでしょう。 Contents of the Address part of Register number Contents of the Decrement part of Register number Lisp が最初に実装された IBM 704 の機械語…