じみな 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")
うまく動いている気がする。