マクロの練習

マックロくろ助出ておいで〜
でないと目玉を・・・・展開するぞこら!!!


・・・。


なんとなくマクロの練習をしておりました。
いつの日かOn Lisp読めるかなぁ。(知識的にも、積読リスト的にも....


まず、andを自分で定義してみる練習

(defmacro and2 (&rest args)
  (cond ((null args) t)
        (t
          (labels ((make-list (x)
                      (cond ((null (cdr x)) (car x))
                               (t (list 'if (car x) (make-list (cdr x)))) )))
                (make-list args)) ) ))

labelsっていうやつを今日知りました。


続いてletを定義してみる訓練

(defmacro mylet (vlist &rest blist)
  `((lambda ,(mapcar #'car vlist) ,@blist) ,@(mapcar #'cadr vlist)) )


そういえばSchemeには名前付きletっていうのがあった(はず)だけど
CLにはなさげ(?)なので定義してみる特訓

(defmacro named-let (name vlist &rest blist)
  `(labels ((,name ,(mapcar #'car vlist) ,@blist))
        (,name ,@(mapcar #'cadr vlist)) ))


ちょびっとマクロナルドにも慣れてきたかなぁ。
macroexpandってなかなか便利ですね


はてな記法で自動で色づけしてくれるのはいいけど、
色合いがあまり好きじゃないかも〜・・・(^^;