2009-08-01から1ヶ月間の記事一覧

マクロの変数捕捉

説明用のシンプルな例を思いついたのでメモ。例えばmy-orを次のように定義したとする。 (define-macro (my-or test1 test2) `(let ((x ,test1)) (if x x ,test2)))しかしこれでは、以下の場合に正しい結果を返さない。 gosh> x #t gosh> (or #f x) #t gosh> …

自家製quasiquote

俺Lispのunquoteしか対応していなかったquasiquoteをunquote-splicingにも対応させてみた。 and,or,cond等の基本マクロの定義にもquasiquoteを使えるように、quasiquote自体の定義にはそれらは使わずに以下で代用。 (and x y) → (if x y #f)で代用。 (or x y…

俺Lispでcall/ccと末尾再帰最適化

昔作った俺Lispにcall/ccと末尾再帰最適化を実装してみた。 (call/cc (lambda (c) (list 1 (c 2) 3))) 2 http://kar.s206.xrea.com/lisp/?e=(call%2Fcc%20(lambda%20(c)%20(list%201%20(c%202)%203))) call/ccのテスト結果 (1 2 3)のリストを作る途中で抜け…