新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

じみな macro

macrolet をつかってみる。だんだん世の中から外れていく気がする。

(defmacro make-style-lambda (style-desc)
  (macrolet ((make-style-lambda0 (style-desc)
              `#'(lambda ,
                   (remove-duplicates
                     (remove nil
                             (mapcar
                               #'(lambda (i)
                                   (if (listp i)
                                     (let ((qkey (car i))
                                           (arg-sym (cadr i)))
                                       (if (or (eq qkey 'SYSTEM::UNQUOTE)
                                               (eq qkey 'SYSTEM::SPLICE))
                                         arg-sym))))
                               (cadr style-desc))) :from-end t) ,style-desc)))
    (if (atom style-desc) (eval `(make-style-lambda0 ,(eval style-desc)))
      `(make-style-lambda0 ,style-desc))))

これで (make-style-lambda `(:a ,arg) とやっても

(let ((x `(:a ,arg))
   (make-style-lambda x))

としても思い通りの lambda が出来るようになった。これ最後 funcall するんだよね。funcall するマクロつくればいいね。

(defmacro do-w (x &body body) `(funcall (make-style-lambda ,x) ,@body))
DO-W
> (do-w `(:a ,arg) "arg")

おーできた。

> (do-w `(:a ,arg) "arg")
(:A "arg")
> (do-w x "abc")
(:A "abc")

うまく動いている気がする。