..
Clojure - java_interopを見ててxyzzyリファレンスにあったoleのマクロを思いだす。10年前なのかこれ。
で、Clojureの..がちょっと便利そうなので書いてみる。
(defmacro $ (obj field &rest args) `(ole-method ,obj ',field ,@args)) (defmacro $$ (obj &rest fields) (reduce #'(lambda (form field) `($ ,form ,@(if (listp field) field (list field)))) fields :initial-value obj)) (defmacro $to (obj &rest methods) `(progn ,@(mapcar #'(lambda (a) `($ ,obj ,@(if (listp a) a (list a)))) methods))) (defmacro $new (sym) `(ole-create-object (symbol-name ',sym))) (defun test-excel () (let* ((xl ($new Excel.Application)) (wb ($$ xl Workbooks Add)) (ws ($ wb Worksheets 1))) (setf ($ xl Visible) t ($$ ws (Range "A1:E1") Value) '("" "North" "South" "East" "West") ($$ ws (Range "A2:E2") Value) '("data1" 5.2 10 8 10) ($$ ws (Range "A3:E3") Value) '("data2" 4 1 2 6)) ($$ ws ChartObjects (Add 50 50 300 200) Chart (SetSourceData ($ ws Range "A1:E3"))) (sit-for 5) (setf ($ wb Saved) t) ($ xl Quit)) (gc)) (defun test-dic () (let ((dic ($new Scripting.Dictionary))) ($to dic (Add 1 "foo") (Add 2 "bar") (Add 3 "baz")) (ole-for-each (k dic) (format t "~A -> ~A~%" k ($ dic Item k)))) (gc))
ole-reader使った方が読みやすいけど、こっちの方がエディタに優しいかも。
cl-win32oleのole関数はまたちょっと違って、メンバと引数を()で括る必要がない。どっちがいいかな。