添削について確認してみた
([obj methodname & methodnames] `(concat (obj-values ~obj ~methodname) (obj-values ~obj ~@methodnames)))
マクロ練習第二弾 - Java オブジェクトのメソッド名とメソッドの値のマップを返す - 地獄のネコブログ
この場合、obj が複数回評価されうるのでよろしくないと思います。
`(let [obj# ~obj]
(concat (obj-values obj# ~methodname) (obj-values obj# ~@methodnames)))))
こんなんが良い、かも?
確認しました。
確かに私の実装ですと、インスタンスが2回生成されてしまいます。
(macroexpand-1 '(obj-values (java.io.File. ".") lastModified canRead)) ;↓結果 (clojure.core/concat (user/obj-values (java.io.File. ".") lastModified) (user/ob j-values (java.io.File. ".") canRead))
ちなみに引用先は私ができなかった分のメソッド名と値のMap版や更なる発展版もあって参考になります。素晴らしいですね。