macro

define-syntax でユニットテスト

結城さんが define-syntax を使った debug マクロ(デバッグプリント - 結城浩のSICP日記 - sicp)を紹介されている。マクロの便利な使い方の好例だと思う。Scheme ではなく、Common Lisp の話になってしまうが、高い評価を受けている Practical Common Lisp…

for

Scheme だとあまり使う場面はないだろうけど、普通の for 文が使いたかったので書いた。一応残しておく。 (define-syntax for (syntax-rules () ((_ (var start end) body ...) (do ((var start (+ 1 var))) ((= var end)) body ...))))実行例。 gosh> (for …

パラメータ用ミニマクロ

gauche.parameter を使うときにちょっと楽できるように。 (define-syntax define-parameter (syntax-rules () ((_ var expr) (define var (make-parameter expr))))) (define-syntax with-parameter (syntax-rules () ((_ (param ...) body ...) (let ((para…

with-slots (2)

引き続き、define-syntax を使った with-slots マクロの定義について。昨日の shiro さんのコメントを受けて修正しつつ、Common Lisp の with-slots の仕様に近づくように修正。以下のサンプルコードを用意。 (define-class <person> () ((name :init-keyword :name)</person>…

with-slots

Common Lisp にある with-slots を Gauche でも使ってみる。次のクラスがあったとき、 (define-class <person> () ((name :init-keyword :name) (gender :init-keyword :gender) (age :init-keyword :age)))こんなふうに使えるようにする。 ;; Example-1 (let ((hoge</person>…

マクロを使ったジェネリック関数宣言の一例

x, y 座標をスロットに持つ vec クラスを考える。Common Lisp では次のような定義になる。 (defclass vec () ((x :initarg :x :initform 0d0 :accessor vec-x) (y :initarg :y :initform 0d0 :accessor vec-y)))ついでに factory も定義しておく。 (defun ma…

do-array

数値計算に現れるパターンの一つに、ループを使って配列の各要素に何らかの演算を行うというものがある。頻出するパターンと来ればマクロの出番だ。Common Lisp のマクロの書き方について非常にわかりやすく書いてある "Macros: Defining Your Own" (Practic…

let-double

マクロの練習その2。Common Lisp では declare を使って変数の型を指定できる。コンパイラはより効率的なコードを生成してくれるので数値計算には便利。 (let ((a 2d0) (b 3d0)) (declare (double-float a b)) (let ((c (+ a b))) (declare (double-float c…

do-lines

マクロの練習で書いてみた、標準の dolist や dotimes マクロに類するループ系マクロ。名前の通り一行ずつ処理。 (defmacro do-lines ((line &optional (in *standard-input*)) &body body) `(do ((,line (read-line ,in nil 'eof) (read-line ,in nil 'eof)…