COMMON LISP JP > Archives > 2009/06/29

2009/06/29 12:52:17 UTCg000001
#
(defvar *test*
  '(("aaa" . "bbb")
    ("ccc" . "ddd")))

(defmacro build-toolbar (val)
  `(progn
     ,@(loop for i in val collect
            `(print ,(car i)))))
#
として上手く動かないのは、loopに渡ってるvalが、(quote val)だからかなー
#
(defmacro build-toolbar (val)
  `(progn
     ,@(loop for i in (eval val) collect
            `(print ,(car i)))))
#
とかquoteはずすのにeval使うとかですかねー
2009/06/29 13:08:34 UTCg000001
#
いや、これだと変数がスペシャルじゃないと駄目か
#
(progn
 (print "aaa")
 (print "ccc"))
#
こうしたいなら、普通に
#
(defun build-toolbar-fun (val)
  (loop :for (i . _) :in val :do (print i)))
#
じゃなかろうか。
2009/06/29 13:20:00 UTCg000001
#
マクロにするとしても
#
(defmacro build-toolbar% (val)
  `(loop :for (i . _) :in ,val :do (print i)))
#
ですよね、多分
#
(defmacro build-toolbar% (val)
  (let ((i (gensym)))
    `(loop :for (,i . _) :in ,val :do (print ,i))))
#
2009/06/29 13:30:43 UTCg000001
#
割と定石から外れるとややこしく感じる