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

JavaScript はじめました

昨日から JavaScript を勉強しはじめた。文法はひととおり学んだけれど、やはり HTML と組み合わせてこそだよな、という物足りない気分。あと、リスト・ユーティリティを充実させると Ruby っぽくなるな、とか。 とりあえず、知ってる知識だけでリストを書い…

ツリーのイテレータ(幅優先)

このまえ深さ優先のトラバースを書いたので、今回は幅優先で。キューを使うので一手間ある。 コード: (defun make-queue () (list nil)) (defun enque (q x) (if (car q) (setf (cdr q) (setf (cddr q) (list x))) (setf (car q) (setf (cdr q) (list x))))…

関数のように振る舞うシーケンスをマクロで

arc という Lisp の方言では、シーケンスが関数のように振る舞うらしい。つまり s にシーケンスが束縛されているとすると、(s n) が Common Lisp における (elt s n) のようになる。 というわけで、同じことを Common Lisp でやってみた。 with-sequence は…

更新されない定数リストの落とし穴

この前、マスターマインドのプログラムを書いたときに遭遇したこと。 以下の関数 random-digits は、与えられた引数を長さとする数字の順列をひとつ返す。ただしバグあり。 CL-USER> (defun random-digits (num) ; wrong (do ((digits '(0 1 2 3 4 5 6 7 8 9…

ツリーのイテレータ(深さ優先)

関数 dft は、リストで表現されたツリーを受け取り、イテレータを作って返す。深さ優先でトラバースしながら、呼ぶたびに葉(リストでないもの)をひとつずつ返す。 (defun dft (tree) (let (stack) (labels ((rec (tr) (cond ((null tr) (rec (pop stack)))…

マクロを書くマクロのパズル

『On Lisp』から、関数やマクロの別名を定義するマクロ。 どれが正しいでしょう? (defmacro abbrev (short long) ; 1 `(defmacro ,short (&rest args) `(,long ,@args))) (defmacro abbrev (short long) ; 2 `(defmacro ,short (&rest args) `(,,long ,@arg…

Scheme 流のラベル付き let

Scheme の勉強をしていたら、つい。Scheme の let のように、ラベルを付けて再帰できるようにするマクロ。 separate-bindings は束縛リストを変数と初期値に分解するユーティリティ。 loop-let の使い方は、第一引数にラベル名を取る以外は let と同じ。この…

前方参照するマクロを自分好みに

it などの特定の変数を暗黙のうちに用意して前方参照できるようにする、いわゆるアナフォリック・マクロ。あれがちょっと好みでないので、変数名を自分で指定する変種を作ってみた。 lif は有名な aif の変数指定版。テスト・フォームの前に変数名を置くだけ…

SLIME ではトップレベル・コマンドが使えない?

私は Lisp の学習に Allegro CL Free Express Edition を Meadow の上で(というか SLIME の上で)使っているわけだけども、トップレベル・コマンドというものが SLIME を介するとうまく使えないみたい。本来ならトップレベルのプロンプト先頭で :help とか …

Common Lisp のリーダ・マクロであれこれ

リーダ・マクロの練習。全体的に Clojure を意識してみました。 ブレース({})は普通の丸括弧と同じ。 #{} はハッシュテーブルを作る。シャープとブレースの間に数を入れるとテスト関数を指定できる。 ブラケット([])はベクタを作る。引数は評価されない…