..

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関数はまたちょっと違って、メンバと引数を()で括る必要がない。どっちがいいかな。