2010-04-01から1ヶ月間の記事一覧

通常の順序で算術式を書けるようにするマクロ +α

最近読んでた本。 LISP〈1〉 (情報処理シリーズ) LISP〈2〉 (情報処理シリーズ) この2巻のほうで、通常の順序で書いた算術式を解釈する方法が解説されている。演習問題として単項演算を導入せよというのがあったので、やってみた。ついでに大小評価を連鎖で…

ベクタを関数に変換するマクロ

Clojure では、Common Lisp におけるベクタの表記みたいなものを使って匿名関数が作れるらしい。羨ましかったので、ちょっと真似してみた。 vector-to-lambda はベクタを見た目通りの関数にする。Common Lisp では縦棒で囲まれた部分がひとつのシンボルにな…

数独を解くプログラム

ふと思い立って、9×9の数独を解くプログラムを作ってみた。問題の数の配置はリストのリストで表現し(0の部分が空欄として扱われる)、関数 sudoku に渡すと勝手に解いてくれる。デフォルトでは解をひとつだけ見つける。オプショナル引数が2つあって、ひ…

たまには日記を書いてみる。

スーパーのレジで買い物袋の有無について尋ねられる。 「袋をお持ちですか」 「袋をご利用でしょうか」 「袋お付けいたしましょうか」 「袋がご必要でしょうか」 バリエーションがたくさんあって、なんだか引っかけ問題みたいだ。 たまには身体によからぬも…

(and (or null not endp) (or car first) (or cdr rest))

Common Lisp において、引数が nil かどうかを判定する述語が3つある。null と not はまったく同じ効果で、endp は引数がリストでないとエラー。 first と car や、rest と cdr も似たような立場にある。同じ効果で違う名前。 もっとも、同じ効果で違う名前…

エイト・クイーン、ついでに N-クイーン

エイト・クイーンを解くプログラムを Common Lisp で書いてみた。 関数 queen にボードのサイズ N を与えると、N×N のボードで N-クイーン問題を解く。 キーワード引数はふたつ。display に nil でない値を与えると、見つけたパターンをすべて表示する。base…

let の代わりに lambda の中でクロージャを作る

lambda 式の中で defun できるってことをいまさら知った。 CL-USER> ((lambda (x) (defun x+ (y) (+ x y))) 1) X+ CL-USER> (x+ 10) 11 CL-USER> ((lambda (x) (defun x+ (y) (+ x y))) 10) X+ CL-USER> (x+ 10) 20 CL-USER> #'x+ #<Interpreted Closure X+></interpreted>

組(tuple)を扱うためのユーティリティ

『On Lisp』の原著を半分くらいまで読んだ。とても面白い。プログラム自体もそうだけど、文章にも味があって。 さて、その本に載っていた do-tuple とその亜種のマクロがけっこう複雑で、コードを理解する前に自分で同じ動作のものを作ったりした、というの…

Clojure を勉強したい

Clojure の勉強をしたいけど、時間が……。とりあえずここを読んでみた。匿名関数が簡単に作れるのは嬉しい。あと関数名に関数オブジェクトが入っているのも。 関数定義で、引数の個数に応じて処理を分岐させられるというのは面白いし便利だ。というわけで Com…

Head First デザインパターン

今まで全然気付いていなかったけど、デザインパターンを扱った私の拙い記事にスターを下さった方々がいました。ありがたや、ありがたや。 そして今日も今日とてデザインパターンの読書。ようやく読み終わった。Head Firstデザインパターン ―頭とからだで覚え…

クロージャをクラスみたいにしたかった

ふと、クロージャにクラスの性質があったら、と考えた。最初は Perl の bless を真似してみようかと思ったけど、参照数のコントロールができないとメモリリークを起こすような気がして、考えるのが面倒になった。そこで代わりにマクロを使って名前あり継承あ…