2010年8月28日土曜日

Clojureのメソッドチェイン風マクロをCommon Lispのマクロで書いてみる

すでにいろいろなところで書かれているネタな気はしますが、書いてみました。

->はexpを次の式の第一引数の位置に挿入し、 ->>はexpを次の式の最後の引数の位置に挿入します。

(defmacro -> (exp &rest rest)
(if rest
(let ((fst (car rest))
(rest (cdr rest)))
(typecase fst
(symbol `(-> (,fst ,exp) ,@rest))
(atom `(-> (,fst ,exp) ,@rest))
(list `(-> (,(car fst) ,exp ,@(cdr fst)) ,@rest))))
exp))

(defmacro ->> (exp &rest rest)
(if rest
(let ((fst (car rest))
(rest (cdr rest)))
(typecase fst
(symbol `(->> (,fst ,exp) ,@rest))
(atom `(->> (,fst ,exp) ,@rest))
(list `(->> (,(car fst) ,@(cdr fst) ,exp) ,@rest))))
exp))

0 件のコメント:

コメントを投稿